Главная страница
    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.48 MB
Время: 0.047 c
2-1188239457
hprx
2007-08-27 22:30
2007.09.23
Menu


15-1187845958
Nic
2007-08-23 09:12
2007.09.23
Проблема при закачке по FTP


1-1184325115
atruhin
2007-07-13 15:11
2007.09.23
Не работает Anchors с MDIChild формой


2-1188372137
greg123
2007-08-29 11:22
2007.09.23
Использование компонента ADOCommand для MS SQL SERVER


11-1172065293
mixail_shar
2007-02-21 16:41
2007.09.23
Кладову





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский