IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Проблема с CreateProcess
Unconnected
сообщение 21.06.2010 17:31
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет всем.

Открываю процесс через CreateProcess, и надобно мне, чтобы окно его создавалось не где придётся, а там, где мне надо. В структуре типа TStartUpInfo полям dwX и dwY присваиваю некоторые значения. Но бестолку, блокнот, например, где был при прошлом ручном запуске, там и остался, при программном.

Procedure createpad;
var StInfo : TStartupInfo;
SeAttr : TSecurityAttributes;
ProcInfo : TProcessInformation;
ProcHandle : THandle;
begin
FillChar(StInfo,SizeOf(StInfo),0);
StInfo.cb := SizeOf(StInfo);
stInfo.dwFlags:=STARTF_USESHOWWINDOW;
StInfo.wShowWindow:=SW_SHOWDEFAULT;
stinfo.dwX:=1000;
stinfo.dwY:=730;
with SeAttr do begin
nLength:=SizeOf(SeAttr);
bInheritHandle:=true;
lpSecurityDescriptor:=nil;
end;
if CreateProcess(nil,
PChar('c:\windows\notepad.exe'),
@SeAttr,@SeAttr,false,NORMAL_PRIORITY_CLASS,
nil,
PChar('C:\WINDOWS\'),
StInfo, ProcInfo) then begin
ProcHandle := ProcInfo.hProcess;
end else raise Exception.Create('');
end;


И ещё вопрос, на эти поля, dwX и dwY (ну может не на эти, а на те, которые отвечают за координаты создания окна) наложены какие-либо ограничения? Например, эти координаты могут быть отрицательными (типа пол-окна за границей экрана)?
Та же история с размерами. Меняю dwXSize и dwYSize.

PS: разрешение экрана 1024-768.

Добавлено через 12 мин.
Цитата
StInfo.wShowWindow:=SW_SHOWDEFAULT;


Мб из-за этого DEFAULT?

Сообщение отредактировано: Unconnected - 21.06.2010 17:32


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.06.2010 18:29
Сообщение #2


Гость






Во-первых:
MSDN->STARTUPINFO Structure
Цитата
dwX
If dwFlags specifies STARTF_USEPOSITION, this member is the x offset of the upper left corner of a window if a new window is created, in pixels. Otherwise, this member is ignored.
У тебя флага STARTF_USEPOSITION нет, насколько я вижу.

Ну, и во-вторых (оттуда же):
Цитата
The offset is from the upper left corner of the screen. For GUI processes, the specified position is used the first time the new process calls CreateWindow to create an overlapped window if the x parameter of CreateWindow is CW_USEDEFAULT.
Ты уверен, что окно Notepad-а создается с CW_USEDEFAULT, чтоб у тебя было право его менять? Я - нет...
 К началу страницы 
+ Ответить 
Unconnected
сообщение 21.06.2010 20:42
Сообщение #3


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
Ты уверен, что окно Notepad-а создается с CW_USEDEFAULT, чтоб у тебя было право его менять?


Ага, кажется, без него создаётся, с STARTF_USEPOSITION тоже не двигается. Так что, получается, без этого USEDEFAULT не получится ничего подобного сделать? WM_CREATE тоже перехватывать без толку будет?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.06.2010 21:21
Сообщение #4


Гость






Зачем тебе перехватывать WM_CREATE у стороннего приложения, если тебе после CreateProcess и так известен хендл окна приложения (не напрямую, но кто обещал, что будет легко)? Возьми и примени к нему MSDN -> MoveWindow

Вот так, например:

function myFunc(wnd:HWND; lParam: LPARAM): BOOL; stdcall;
begin
MoveWindow(wnd, 20, 20, 400, 400, True); // Ну, забрось окно куда нужно
result := False;
end;

...
// здесь создаешь процесс

WaitForInputIdle(ProcInfo.hProcess, INFINITE); // Ждем создания окна
EnumThreadWindows(ProcInfo.dwThreadId, @myFunc, 0);


(только аккуратнее с таким способом - это далеко не для любого процесса, я воспользовался тем, что запуск Notepad-а создает только одно окно, принадлежащее единственному треду. С другими приложениями может быть не так просто). Чтоб не "мигало" - создай окно скрытым, а потом, после перемещения - "открой" его...
 К началу страницы 
+ Ответить 
Unconnected
сообщение 22.06.2010 11:09
Сообщение #5


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Спасибо, работает. Это то, что нужно smile.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 3.07.2025 14:00
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"