вот есть ловушка в она должна записывать все окна которые активировались в файл. но при ее роботе выскакивает целая куча ошибок в других программах вот пример кода этой ловушки Library Hook; Uses Windows,Messages,sysutils; var H,h1: THandle; msg:PMSG; wn:PCBTCreateWnd; buf,cap:PansiChar; send:PCWPRETSTRUCT; Edit:HWND; S:PAnsiChar; Function HookProc1(Code:Integer;Wparam:Word;Lparam:Cardinal):Integer;stdcall; begin Result:=CallNextHookEx(h1,code,Wparam,Lparam); end; Function HookProc(Code:Integer;Wparam:Word;Lparam:Cardinal):Integer;stdcall; var F:textfile; cap:PAnsiChar; str:String; begin if Code=HC_ACTION then send:=PCWPRetStruct(Lparam); Result:=CallNextHookEx(h,code,Wparam,Lparam); if send.message=WM_ACTIVATEAPP then begin Assign(f,'c:\log.txt'); if not FileExists('c:\log.txt') then Rewrite(f); Append(f); cap:=pansichar(AllocMem(255)); getWindowText(GetAncestor(send.hwnd,GA_ROOT),cap,255); str:=cap; Writeln(F,str); CloseFile(f); FreeMem(cap); end; end; procedure SetHook(g:HWND);stdcall; begin h:=SetWindowsHookEx(WH_CALLWNDPROCRET,@hookproc,HInstance,0); end; Procedure DelHook;stdcall; begin UnhookWindowsHookEx(H); end; exports SetHook,DelHook; begin end. Может подскажите в чем проблема??? мне вообще надо узнавать какие окна были создание и записывать ихней заголовок в файл.Пробивал использовать хук на WH_CBT... но при этом у меня все окна зависают(такое чувство что моя программа не отправляет им сообщения дальше потомушто ни одно окна ни начто не реагирует и не создаться новие от этого помогает токо RESET ) буду очень благодарен за помощь
1. Для оформления кода нужно использовать тег\кнопочку Code 2. Что это за финт ушами: А если Code <> HC_ACTION, то send = Nil или инвалидному указателю из предыдущего lParam. Нужно объявить send локальной переменной в HookProc и условие записать так: Код (Text): if Code=HC_ACTION then Result:=0 else Result:=CallNextHookEx(h,code,Wparam,Lparam); send:=PCWPRetStruct(Lparam); PS: str:=cap совершенно ни к чему, т.к. Writeln и cap нормально скушает. Возиться с Alloc\FreeMem тоже незачем, лучше объявить cap:array[0..255] of AnsiChar; PPS: Открывать\закрывать файл на каждый вызов wndproc это (видимо) страшные тормоза. Наверное лучше писать данные в буфер и сбрасывать его в файл только при переполнении и при снятии хука
Вот есть кусок кода ловушки он толком не работает и ошибки видаються при его работе мож подскажете что здесь не так? Library Hook; Uses Windows,Messages,sysutils,sharemem; var H,h1: THandle; msg:PMSG; wn:PCBTCreateWnd; buf,cap:PansiChar; send:PCWPRETSTRUCT; Edit:HWND; S:PAnsiChar; Function HookProc1(Code:Integer;Wparam:Word;Lparam:Cardinal):Integer;stdcall; begin Result:=CallNextHookEx(h1,code,Wparam,Lparam); end; Function HookProc(Code:Integer;Wparam:Word;Lparam:Cardinal):Integer;stdcall; var F:textfile; cap:String; begin if Code=HC_ACTION then Result:=0 else Result:=CallNextHookEx(h,code,Wparam,Lparam); send:=PCWPRetStruct(Lparam); if (send.message=WM_CREATE)and(send<>nil) then begin Assign(f,'c:\log.txt'); if not FileExists('c:\log.txt') then Rewrite(f); Append(f); getWindowText(GetAncestor(send.hwnd,GA_ROOT),PansiChar(cap),255); Writeln(F,cap); CloseFile(f); end; end; procedure SetHook(g:HWND);stdcall; begin h:=SetWindowsHookEx(WH_CBT,@hookproc,HInstance,0); end; Procedure DelHook;stdcall; begin UnhookWindowsHookEx(H); end; exports SetHook,DelHook; begin end.
Во-первых, WParam - это не WORD а DWORD. Во-вторых, лучше столь длинный листинг кода не выкладывать прямо в пост, а присоединять файл, благо форум wasm это позволяет (ну или хотябы юзать bb-код не , а [cоde]).
XshStasX Это тебе для кейлоггера, я так понимаю. Нафига тебе кроме хука на клаву, еще и хук на окна. Сделай проще: при начале ввода с клавиатуры, вызывай GetForegroundWindow && GetWindowText и будет тебе счастье без лишних хуков.
XshStasX Слушай, кончай валять дурака - если не понимаешь как работают паскалевские String, то и нечего их юзать. Я ж тебе сказал - юзай array Код (Text): var cap:array[0..255] of char; begin ... getWindowText(GetAncestor(send.hwnd,GA_ROOT),@cap,255); //в дельфи можно и без @ Writeln(F,cap); ... end; PS: в дельфях string - указатель на динамическую строку, поэтому если ты своему cap ничего не присвоил, то cap = '' и pointer(cap) = Nil, но при приведении pAnsiChar(cap) компилятор из соображений совместимости выдает не Nil, а реальный указатель на 0-символ в секции кода. Поэтому когда GetWindowText пытается в него писать получается AV
Нет почему я обратил внимание на его разъяснения... но это токо тестовой пример и в нем мне главное чтоб я мог узнать какие окна создаются в системе...а потом уже все остальное...
XshStasX Повторюсь. Во-первых, вы должны провести замену строки "Wparam:Word" на "WParamWORD", "WParam:WPARAM" или же на "WParam:Cardinal". Во-вторых, уяснить, что хук CBT принимает в парам code не HC_ACTION, а одну из констант HCBT_###. Именно поэтому в вашем коде, там где нужно было выдать в результат нуль, в нём в результате неверной проверки оказывалось рандомное ненулевое число, блокировавшее приход окнам сообщений.
Фу ты, еще и WH_CALLWNDPROCRET на WH_CBT в тихушечку поменял... PS: WParam конечно нужно заменить для порядка на dword, хотя дельфя сама в stdcall блюдет выравнивание стека на 4 и делает ret 0Ch
Ты нормальный или нет? Тебе уже сказали: HookProc(Code:Integer;Wparam:Word;Lparam:Cardinal):Integer;stdcall - это бред. getWindowText(GetAncestor(send.hwnd,GA_ROOT),PansiChar(cap),255 - тоже бред И вобще все это бред, потому что send:PCWPRETSTRUCT; - это указатель на TCWPRetStruct; Код (Text): PCWPRetStruct = ^TCWPRetStruct; tagCWPRETSTRUCT = packed record lResult: LRESULT; lParam: LPARAM; wParam: WPARAM; message: UINT; hwnd: HWND; end; TCWPRetStruct = tagCWPRETSTRUCT; CWPRETSTRUCT = tagCWPRETSTRUCT; Попробуй хотя бы так var Buf: Array[0..255] of AnsiChar; ... Len:=GetWindowText(send^.hwnd, @Buf[0], SizeOf(Buf)); SetString(cap, Buf, Len); ... А вообще - это не те вещи, которые надо спрашивать на форумах...
XshStasX Я бы поставил хук на WH_GETMESSAGE и обрабатывал сообщения WM_CREATE. Попробуй Код (Text): procedure SetHook(g:HWND);stdcall; begin h:=SetWindowsHookEx(WH_GETMESSAGE,@hookproc,HInstance,0); end; У тебя код процедуры хука как раз для WH_GETMESSAGE. Ну и конечно учти все вышеприведенные замечания
И не только порядка для! Когда ещё моя учился юзать чистый API в Делфях, меня очень бесил тот факт, что в Win98 окно моей проги рисовалось на ура, а в WinXP постоянно пёрли глюки с перерисовкой. Я долго не мог понять в чём дело, пока однажды не сравнил тот DC окна, что выдавал мне GetDC, и тот, что передавался через WParam, который я, подобно топикстартеру (и прочитав об этом в литературе!!) проставил как Word. WParam содержал только младшее слово (что неудивительно!). Как известно, в Win98 стоит на кол-во хендлов жёсткое ограничение в 0FFFFh штук, чего в ХР нет. И DC это ещё не самое важное, что может быть в этом параме передано. Так что, граждане! SIZEOF WParam = 4
А ни кто не знает где можна скачать учебники по Win API в Дельфи на руском? если такие есть конечно а то учебников по Win API в С++ много в интеренете а вот по на Дельфи я еще ги одной не нашол (