Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.027 c
15-1187947154
sample01
2007-08-24 13:19
2007.09.23
Explorer


15-1187835901
Slider007
2007-08-23 06:25
2007.09.23
С днем рождения ! 23 августа 2007 четверг


11-1171208942
Виталий*
2007-02-11 18:49
2007.09.23
как в list view программно чекбоксы включать и выключать?


4-1174975882
forward
2007-03-27 10:11
2007.09.23
Рабочий стол не обновляется


15-1187945267
Nic (from server)
2007-08-24 12:47
2007.09.23
Ещё одна проблема с web-сервером