Текущий архив: 2007.09.23;
Скачать: CL | DM;
Вниззапускается чужая программа, надо узнать хэндл окна... Найти похожие ветки
← →
Альберт © (2007-03-25 23:58) [0]делаю так в 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_AppInstance then
begin
//wparam - хэндл???
UnhookWindowsHookEx(GlobalData.SysHook);
end;
end;
_SysMsgProc:= CallNextHookEx(GlobalData.SysHook, Code, wParam, lParam);
end;
← →
Углук © (2007-03-26 00:03) [1]FindWindow(nil,"Имя окна")
← →
Альберт © (2007-03-26 00:09) [2]это понятно. а если имя неизвестно?
← →
homm © (2007-03-26 00:47) [3]> //wparam - хэндл???
HCBT_CREATEWND wParam: Specifies the handle to the new window.
Вопрос был в этом? Странно что ты не нашел.
← →
Альберт © (2007-03-26 00:50) [4]да не говори..
← →
Альберт © (2007-03-26 00:56) [5]CBT_CREATEWND(Pointer(lParam)^).lpcs.hInstance = GlobalData.window_AppInstance - это строка вообще не выходит. нет равенства.
← →
Leonid Troyanovsky © (2007-03-26 22:11) [6]
> Альберт © (25.03.07 23:58)
> GlobalData- глобальные данные.
Бездоказательно.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-03-26 22:32) [7]
> Альберт © (26.03.07 00:56) [5]
> CBT_CREATEWND(Pointer(lParam)^).lpcs.hInstance
Какойнах hInstance?
См., например, GetWindowThreadProcessId.
Да, и еще, PCBTCreateWnd, а то уж очень коряво выглядит.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-03-26 22:40) [8]
> Альберт © (25.03.07 23:58)
> GlobalData.window_AppInstance:=ShellExecute(0, "open",
Да, и, еще.
Пускать всякие хуки имеет смысл лишь после WaitForInputIdle,
т.е., приложения надо пускать путем CreateProcess,
ShellExecuteEx (см. соседние топики).
Но, а так как нужен processId (threadId) - то только первым.
--
Regards, LVT.
← →
Альберт © (2007-03-26 23:27) [9]
> > Альберт © (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.
в случае совпадения, делаю анхук.
правильно?
← →
Альберт © (2007-03-26 23:37) [10]
> Пускать всякие хуки имеет смысл лишь после WaitForInputIdle,
я не понял почему хуки надо после пускать, если окно может появиться до установления хука
← →
Leonid Troyanovsky © (2007-03-27 00:06) [11]
> Альберт © (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.
← →
Leonid Troyanovsky © (2007-03-27 00:10) [12]
> Альберт © (26.03.07 23:37) [10]
> я не понял почему хуки надо после пускать, если окно может
> появиться до установления хука
Ну, может я немного погорячился.
Но, после можно ставить локальные хуки, т.е., на поток.
А до - лишь глобальные. Что на порядок более ответсвенно.
Да, и, во-ще, все это решить без хуков, IMHO.
Что значит - без лишней dll.
--
Regards, LVT.
← →
Альберт © (2007-03-28 23:31) [13]сделал, получилось) спасибо огромное
Страницы: 1 вся ветка
Текущий архив: 2007.09.23;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.047 c