Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

запускается чужая программа, надо узнать хэндл окна...   Найти похожие ветки 

 
Альберт ©   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.056 c
10-1132784192
Nortsov
2005-11-24 01:16
2007.09.23
запись вариантного массива в файл


2-1188476752
parivet
2007-08-30 16:25
2007.09.23
Вопрос на засыпку


1-1184211090
Phoenix
2007-07-12 07:31
2007.09.23
Необходимо определить были ли пороизведенны изменения на форме


2-1188543049
Че
2007-08-31 10:50
2007.09.23
О выключении Windows


15-1187946133
@!!ex
2007-08-24 13:02
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский