![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запускается чужая программа, надо узнать хэндл окна... [D6, WinXP]
Альберт © (2007-03-25 23:58:00)делаю так в dll
GlobalData- глобальные данные.
function RunAndGetWnd(path:String):HWND;
begin
GlobalData.SysHook:=SetWindowsHookEx(WH_CBT, @_SysMsgProc, HInstance, 0);
GlobalData.window_AppInstance:=ShellExecute(0, 'open', 'calc.exe' , '' , nil, 1);
end;
function _SysMsgProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
if code = HCBT_CREATEWND then
begin
if CBT_CREATEWND(Pointer(lParam)^).lpcs.hInstance = GlobalData.window_AppInstancethen
begin
//wparam - хэндл???
UnhookWindowsHookEx(GlobalData.SysHook);
end;
end;
_SysMsgProc:= CallNextHookEx(GlobalData.SysHook, Code, wParam, lParam);
end;
Альберт (2007-03-28 23:31:00) [1]сделал, получилось) спасибо огромное
Leonid Troyanovsky (2007-03-27 00:10:00) [2]
> Альберт © (26.03.07 23:37) [10]
> я не понял почему хуки надо после пускать, если окно может
> появиться до установления хука
Ну, может я немного погорячился.
Но, после можно ставить локальные хуки, т.е., на поток.
А до - лишь глобальные. Что на порядок более ответсвенно.
Да, и, во-ще, все это решить без хуков, IMHO.
Что значит - без лишней dll.
--
Regards, LVT.
Leonid Troyanovsky (2007-03-27 00:06:00) [3]
> Альберт © (26.03.07 23:27) [9]
> // я это имел ввиду
Правилами хорошего тона предусмотрено, во-ще,
DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH -
не пользовать, а делать инициализацию по первому обращению.
Но, это так, к слову.
Можно считать, что первый тезис - не голословен.
> TMSG(Pointer(wParam)^).wnd
Во, опять. Какойнах Pointer(wParam)?
wParam: Specifies the handle to the new window.
Ну, может HWND(wParam) - для пуристов.
> я так понял. сначала ставлю hook в dllке.
> потом делаю createprocess, получаю processId. присваиваю
> его своей переменной.
> проверяю на равенство с помощью GetWindowThreadProcessId.
> в случае совпадения, делаю анхук.
Не знаю насчет совпадений, но после WaitForInputIdle -
EnumThreadWindow - перечислит все созданные (первичным)
потоком недочерние окна.
Не знаю, имеет ли первое созданное окно такое важное значение -
я бы искал то, которое, дейс-но, нужно, т.е., с нужным классом,
заголовком, меню и т.д.
Можно даже без хука, т.к., пока хендл первичного потока не закрыт, EnumThreadWindows будет перечислять окна так, как ожидается.
--
Regards, LVT.
Альберт (2007-03-26 23:37:00) [4]
> Пускать всякие хуки имеет смысл лишь после WaitForInputIdle,
я не понял почему хуки надо после пускать, если окно может появиться до установления хука
Альберт (2007-03-26 23:27:00) [5]
> > Альберт © (25.03.07 23:58)
>
> > GlobalData- глобальные данные.
>
> Бездоказательно.
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
// ля ля ля
window_AppInstance:HINST;
end;
procedure OpenGlobalData();
begin
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
end;
end;
procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;
procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
// я это имел ввиду
..-------------------------------
> Какойнах hInstance?
> См., например, GetWindowThreadProcessId.
>
> Да, и еще, PCBTCreateWnd, а то уж очень коряво выглядит.
>
вопрос. а на фига тогда вообще нужен этот PCBTCreateWnd мне, если получается следует так использовать
TMSG(Pointer(wParam)^).wnd ?не врубаюсь
--------------------------------------------------------
я так понял. сначала ставлю hook в dllке.
потом делаю createprocess, получаю processId. присваиваю его своей переменной.
проверяю на равенство с помощью GetWindowThreadProcessId.
в случае совпадения, делаю анхук.
правильно?
Leonid Troyanovsky (2007-03-26 22:40:00) [6]
> Альберт © (25.03.07 23:58)
> GlobalData.window_AppInstance:=ShellExecute(0, 'open',
Да, и, еще.
Пускать всякие хуки имеет смысл лишь после WaitForInputIdle,
т.е., приложения надо пускать путем CreateProcess,
ShellExecuteEx (см. соседние топики).
Но, а так как нужен processId (threadId) - то только первым.
--
Regards, LVT.
Leonid Troyanovsky (2007-03-26 22:32:00) [7]
> Альберт © (26.03.07 00:56) [5]
> CBT_CREATEWND(Pointer(lParam)^).lpcs.hInstance
Какойнах hInstance?
См., например, GetWindowThreadProcessId.
Да, и еще, PCBTCreateWnd, а то уж очень коряво выглядит.
--
Regards, LVT.
Leonid Troyanovsky (2007-03-26 22:11:00) [8]
> Альберт © (25.03.07 23:58)
> GlobalData- глобальные данные.
Бездоказательно.
--
Regards, LVT.
Альберт (2007-03-26 00:56:00) [9]CBT_CREATEWND(Pointer(lParam)^).lpcs.hInstance = GlobalData.window_AppInstance - это строка вообще не выходит. нет равенства.
Альберт (2007-03-26 00:50:00) [10]да не говори..
homm (2007-03-26 00:47:00) [11]> //wparam - хэндл???
HCBT_CREATEWND wParam: Specifies the handle to the new window.
Вопрос был в этом? Странно что ты не нашел.
Альберт (2007-03-26 00:09:00) [12]это понятно. а если имя неизвестно?
Углук (2007-03-26 00:03:00) [13]FindWindow(nil,'Имя окна')