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 21:21
Сообщение #2


Гость






Зачем тебе перехватывать 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-а создает только одно окно, принадлежащее единственному треду. С другими приложениями может быть не так просто). Чтоб не "мигало" - создай окно скрытым, а потом, после перемещения - "открой" его...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



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