powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не устанавливается хук WH_CBT
44 сообщений из 44, показаны все 2 страниц
Не устанавливается хук WH_CBT
    #39547091
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
uses
  Windows, Messages, SysUtils, Classes, Dialogs, menus, Forms;

  procedure SetHook;
  procedure UnSetHook;


implementation


var
  MyHook: HHOOK;

function CBTProc(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
  if Code = 0 then
  begin
    Result:= CallNextHookEx(MyHook, Code, WParam, LParam);
    Exit;
  end;
  case Code of
    HCBT_CREATEWND: ShowMessage('1');
  end;
end;

procedure SetHook;
begin
  MyHook:= SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
  if MyHook = 0 then
     ShowMessage('error');
end;

procedure UnSetHook;
begin
  UnHookWindowsHookEx(MyHook);
end;

end.



А WH_MOUSE_LL ставиться и робит без проблем.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547109
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9
Код: pascal
1.
2.
uses
... Dialogs, menus, Forms;

EXE или DLL?
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547110
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EXE
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547111
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9EXE
Код: pascal
1.
SetWindowsHookEx(WH_CBT, @CBTProc, 0, MainThreadID);
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547296
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В EXE нельзя создавать глобальные хуки, только под конкретную нить.
Хуки на глобальные нити разрешены только в DLL
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547301
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-CiteВ EXE нельзя создавать глобальные хуки, только под конкретную нить.
Хуки на глобальные нити разрешены только в DLL
Да, спасибо.
Когда то читал про это, но на практике WH_MOUSE_LL встал в EXE, а он вроде тоже бы глобальный.
Сейчас пишу в DLL.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547304
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547381
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, попытался реализовать через длл
Код EXE
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
unit MU;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sButton, sMemo;

type
  TMF = class(TForm)
    Button_SetHook: TsButton;
    Memo: TsMemo;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button_SetHookClick(Sender: TObject);
  private
    procedure wmUser(var Msg: tMessage); message WM_USER + $125;
  public
    { Public declarations }
  end;

var
  MF: TMF;

implementation

{$R *.dfm}

var
  HOOK: THandle;
  SetHook: function(wnd: hwnd): boolean; stdcall;
  UnSetHook: procedure; stdcall;

procedure TMF.wmUser(var Msg: tMessage);
begin
  Memo.Lines.Add(Msg.WParam.ToString);
end;

procedure TMF.Button_SetHookClick(Sender: TObject);
begin
  SetHook(Self.Handle);
end;

procedure TMF.FormCreate(Sender: TObject);
begin
  @SetHook := nil;
  @UnSetHook := nil;
  HOOK := LoadLibrary('HOOK.dll');
  if HOOK <> 0 then
  begin
    @SetHook := GetProcAddress(HOOK, 'SetHook');
    if not Assigned(@SetHook) then
      raise Exception.Create('Функция с именем "SetHook" не найдена в библиотеке "HOOK"!');

    @UnSetHook := GetProcAddress(HOOK, 'UnSetHook');
    if not Assigned(@UnSetHook) then
      raise Exception.Create('Функция с именем "UnSetHook" не найдена в библиотеке "HOOK"!');
  end else
  ShowMessage('Не удалось подрузить DLL "HOOK"');
end;

procedure TMF.FormDestroy(Sender: TObject);
begin
  UnSetHook;
  FreeLibrary(HOOK);
end;



DLL
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
library HOOK;

uses
  System.SysUtils,
  System.Classes,
  Vcl.Dialogs,
  Winapi.Windows,
  Winapi.Messages;

{$R *.res}

const
  HookMsg = WM_USER + $125;

var
  MyHook: hwnd;
  AppWnd: hwnd;

//------------------------------------------------------------------------------
// CBTProc
//------------------------------------------------------------------------------
function CBTProc(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
  if Code < 0 then
    Result := CallNextHookEx(MyHook, Code, wParam, lParam);
  case Code of
    HCBT_CREATEWND: PostMessage(AppWnd, HookMsg, wParam, 0);
  end;
  Result := CallNextHookEx(MyHook, Code, wParam, lParam);
end;

//------------------------------------------------------------------------------
// SetHook
//------------------------------------------------------------------------------
function SetHook(wnd: hwnd): boolean; export; stdcall;
begin
  AppWnd := wnd;
  MyHook:= SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
  if MyHook = 0 then
    Result := false else
    Result := true;
end;

//------------------------------------------------------------------------------
// UnSetHook
//------------------------------------------------------------------------------
procedure UnSetHook; export; stdcall;
begin
  UnHookWindowsHookEx(MyHook);
end;

exports
  SetHook, UnSetHook;

begin

end.



При запуске EXE в МЕМО добавляется одна строка, хотя я никаких окон не открывали и дальше тишина.
Где то накосячил.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547385
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

А зачем в CBTProc вызывать CallNextHookEx 2 раза ?
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547387
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiMiracle9,

А зачем в CBTProc вызывать CallNextHookEx 2 раза ?
Если оставить
Код: pascal
1.
2.
3.
4.
5.
  if Code < 0 then
  begin
    Result := CallNextHookEx(MyHook, Code, wParam, lParam);
    Exit;
  end;



То форма потом ни на что не реагирует.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547391
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiMiracle9,

А зачем в CBTProc вызывать CallNextHookEx 2 раза ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function CBTProc(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(MyHook, Code, wParam, lParam);
  case Code of
    HCBT_CREATEWND: PostMessage(AppWnd, HookMsg, wParam, 0);
  end;
 // Result := CallNextHookEx(MyHook, Code, wParam, lParam);
end;



При таком варианте форма не зависает, но в МЕМО ничего не пишется, лишь один хендл при установке.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547502
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function CBTProc(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
  if Code < 0 then
    Result := CallNextHookEx(MyHook, Code, wParam, lParam);
  else begin
    Result := 0;
    case Code of
      HCBT_CREATEWND: PostMessage(AppWnd, HookMsg, wParam, 0);
    end;
  end;
end;
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547515
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9schiMiracle9,

А зачем в CBTProc вызывать CallNextHookEx 2 раза ?
Если оставить
Код: pascal
1.
2.
3.
4.
5.
  if Code < 0 then
  begin
    Result := CallNextHookEx(MyHook, Code, wParam, lParam);
    Exit;
  end;



То форма потом ни на что не реагирует.

Это метод тыка теперь такой ?

CallNextHookEx надо вызывать всегда, но один раз.

"Calling CallNextHookEx is optional, but it is highly recommended; otherwise, other applications that have installed hooks will not receive hook notifications and may behave incorrectly as a result. You should call CallNextHookEx unless you absolutely need to prevent the notification from being seen by other applications."
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644974(v=vs.85).aspx
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547542
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все работает...
Просто не все программы походу генерируют событие. Например Calc.exe почему то не генерирует вызов HCBT_CREATEWND
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
library Project4;

uses
  Winapi.Windows,
  System.SysUtils,
  CodeSiteLogging;

{$R *.res}

var
  MyHook: HHOOK;

function CBTProc(aCode: Integer; aWParam: WPARAM; aLParam: LPARAM): LRESULT; stdcall;
begin
  if aCode < 0 then
    Exit(CallNextHookEx(MyHook, aCode, aWParam, aLParam));
  case aCode of
    HCBT_CREATEWND:
      CodeSite.Send('WParam = ' + aWParam.ToString());
  end;
  Exit(CallNextHookEx(MyHook, aCode, aWParam, aLParam));
end;

function SetHook: Boolean; stdcall;
begin
  MyHook := SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
  Result := MyHook <> 0;
end;

procedure UnSetHook; stdcall;
begin
  UnHookWindowsHookEx(MyHook);
end;

exports SetHook, UnSetHook;

begin
end.



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
type
  TForm7 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  function SetHook: Boolean; stdcall; external 'Project4' delayed;
  procedure UnSetHook; stdcall; external 'Project4' delayed;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);
begin
  SetHook();
end;

procedure TForm7.Button2Click(Sender: TObject);
begin
  UnSetHook();
end;


...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547543
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteВсе работает...
Просто не все программы походу генерируют событие. Например Calc.exe почему то не генерирует вызов HCBT_CREATEWND

Если это Windows 10 то, возможно, это потому что calc.exe там - это не нативное приложение.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547550
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpX-CiteВсе работает...
Просто не все программы походу генерируют событие. Например Calc.exe почему то не генерирует вызов HCBT_CREATEWND

Если это Windows 10 то, возможно, это потому что calc.exe там - это не нативное приложение.
Windows 7
Можно поставить API Monitor и посмотреть вообще что вызывает...
Походу все что работает через виртуальные машины, java .net это не отлавливается....
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547571
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я до этого ShellHookWindow тестил, там отлов новых окон отлично работает.
И на этом всё. А, ну ещё FLASH тоже хорошо работает.
Смена активного окна не работает.
А отлов уничтожения окна работает, но там один и тот же хендл окна по 10 раз присылается.
Вот решил потестить SetWindowsHookEx с WH_CBT.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547576
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schi
"Это метод тыка теперь такой ?"
В точку)
Я до этого не практиковал установку хуков.
Обычно беру код из интернета, тестирую, а потом разбираю.
А тут в инете 100500 вариантов из статей и ни один не робит.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547581
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак весь день.
Использовал код X-Cite с поправкой на
Код: pascal
1.
PostMessage(AppWnd, HookMsg, wParam, 0);



При установке хука постоянно сразу какой то wnd кидается, хотя я никаких окон не открывал.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547583
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547633
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

вот тебе рабочий код hook.dll
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
library hook;

uses
  System.SysUtils,
  System.Classes,
  Vcl.Dialogs,
  Winapi.Windows,
  DBugIntf,
  Winapi.Messages;

{$R *.res}

const
  HookMsg = WM_USER + $0125;
  ID_APP = 'APPHWND';
  ID_HOOK = 'HHOOKID';

//------------------------------------------------------------------------------
// CBTProc
//------------------------------------------------------------------------------
function CBTProc(Code: NativeInt; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
  AppWnd: HWND;
begin
  AppWnd := GetDesktopWindow();
  if Code > 0 then begin
    Result := 0;
    AppWnd := GetProp(AppWnd, ID_APP);
    if Code = HCBT_CREATEWND then
      PostMessage(AppWnd, HookMsg, wParam, 0);
  end else
    Result := CallNextHookEx(GetProp(AppWnd, ID_HOOK), Code, wParam, lParam)
end;

//------------------------------------------------------------------------------
// SetHook
//------------------------------------------------------------------------------
function SetHook(wnd: hwnd): boolean; export; stdcall;
var
  hwndDsk: HWND;
  HookID: HHOOK;
begin
  hwndDsk := GetDesktopWindow();
  SetProp(hwndDsk, ID_APP, wnd);
  HookID:= SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
  SetProp(hwndDsk, ID_HOOK, HookID);
  Result := HookID <> 0;
end;

//------------------------------------------------------------------------------
// UnSetHook
//------------------------------------------------------------------------------
procedure UnSetHook; export; stdcall;
var
  AppWnd: HWND;
  HookID: HHOOK;
begin
  AppWnd := GetDesktopWindow();
  HookID := GetProp(AppWnd, ID_HOOK);
  if HookID <> 0 then
    UnHookWindowsHookEx(HookID);
end;

exports
  SetHook, UnSetHook;

end.


Если вкратце, то:
Код: pascal
1.
2.
3.
var
  MyHook: hwnd;
  AppWnd: hwnd;


не канает, т.к. хук вызывается в контексте разных процессов, а в dll глобальные переменные глобальны только в рамках одного процесса, т.е. при выхове CBTProc в других процессах MyHook = AppWnd = 0.

Ну и не забывай, что если винда x64, приложение x86 ставит хуки только на такие же, и надо делать отдельно x86 хук и отдельно x64 хук.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547652
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpне канает, т.к. хук вызывается в контексте разных процессов, а в dll глобальные переменные глобальны только в рамках одного процесса, т.е. при выхове CBTProc в других процессах MyHook = AppWnd = 0.

Ну и не забывай, что если винда x64, приложение x86 ставит хуки только на такие же, и надо делать отдельно x86 хук и отдельно x64 хук.
Кстати да... На моем скриншоте видно, что лог идет от приложения в которое внедрилась dll. Столбец AppName.
Но это можно легко решить через SharedMemory.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547671
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, Большое спасибо!
"Ну и не забывай, что если винда x64, приложение x86 ставит хуки только на такие же, и надо делать отдельно x86 хук и отдельно x64 хук."
Очень важная инфа на будущее, Только, на сколько я помню, x64 приложение работает с длл x64. Т.е. с одного приложения не получится сделать импорт функций из 2ух x86 и x64 длл.

Потестил работу хука, он получается отлавливает все окна и главные и вложенные. В этом плане RegisterShellHookWindow мне больше подходит. И там пофиг на разрядность. Жаль что HSHELL_WINDOWACTIVATED молчит.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547672
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

Вы читали ее описание?
автор[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547673
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9Потестил работу хука, он получается отлавливает все окна и главные и вложенные.
Это можно решить через те же API функции, например GetParent.. определить когда главное, а когда дочернее.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547704
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-CiteMiracle9Потестил работу хука, он получается отлавливает все окна и главные и вложенные.
Это можно решить через те же API функции, например GetParent.. определить когда главное, а когда дочернее.
Или вместо WH_CBT использовать WH_SHELL.

А по поводу [This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]
Обидно, как для новичка была проста в использовании.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547711
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WH_SHELL тоже похоже не работает, надо искать в msdn
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547713
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, при UnSetHook одно из приложений падает. Есть идеи?
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547714
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9alekcvp, при UnSetHook одно из приложений падает. Есть идеи?
Код покажите
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547722
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код тот же самый (что предоставил alekcvp).
Но фиг с ним с WH_CBT, очень хочется понять почему если заменить WH_CBT на WH_SHELL, то в EXE приходят коды только на его хендл.
Я добавил ещё messagebeep(0);

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
library HOOK;

uses
  System.SysUtils,
  System.Classes,
  Vcl.Dialogs,
  Winapi.Windows,
  Winapi.Messages;

{$R *.res}

const
  HookMsg = WM_USER + $0125;
  ID_APP = 'APPHWND';
  ID_HOOK = 'HHOOKID';

//------------------------------------------------------------------------------
// CBTProc
//------------------------------------------------------------------------------
function CBTProc(Code: NativeInt; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
  AppWnd: HWND;
begin
  messagebeep(0);
  AppWnd := GetDesktopWindow();
  if Code > 0 then begin
    Result := 0;
    AppWnd := GetProp(AppWnd, ID_APP);
    PostMessage(AppWnd, HookMsg, wParam, Code);
  end else
    Result := CallNextHookEx(GetProp(AppWnd, ID_HOOK), Code, wParam, lParam)
end;

//------------------------------------------------------------------------------
// SetHook
//------------------------------------------------------------------------------
function SetHook(wnd: hwnd): boolean; export; stdcall;
var
  hwndDsk: HWND;
  HookID: HHOOK;
begin
  hwndDsk := GetDesktopWindow();
  SetProp(hwndDsk, ID_APP, wnd);
  HookID:= SetWindowsHookEx(WH_SHELL, @CBTProc, HInstance, 0);
  SetProp(hwndDsk, ID_HOOK, HookID);
  Result := HookID <> 0;
end;

//------------------------------------------------------------------------------
// UnSetHook
//------------------------------------------------------------------------------
procedure UnSetHook; export; stdcall;
var
  AppWnd: HWND;
  HookID: HHOOK;
begin
  AppWnd := GetDesktopWindow();
  HookID := GetProp(AppWnd, ID_HOOK);
  if HookID <> 0 then
    UnHookWindowsHookEx(HookID);
end;

exports
  SetHook, UnSetHook;

end.


И когда переключаешься между чужими окнами(идёт смена активного окна) бипы слышно, но в ЕХЕ ничего не приходит.
И кстати, кому если понадобится, я нашёл для RegisterShellHookWindow недостающие значение WParam на активное окно

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
//------------------------------------------------------------------------------
// ShellHookMessage
//------------------------------------------------------------------------------
const
  HSHELL_WINDOWCREATED = 1;
  HSHELL_WINDOWDESTROYED = 2;
  HSHELL_WINDOWACTIVATED = 32772;
  HSHELL_FLASH = 32774;



Это было не сложно) 4 поменялась на 32772
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547753
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9Код тот же самый (что предоставил alekcvp).
Но фиг с ним с WH_CBT, очень хочется понять почему если заменить WH_CBT на WH_SHELL, то в EXE приходят коды только на его хендл.
Я добавил ещё messagebeep(0);

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
library HOOK;

uses
  System.SysUtils,
  System.Classes,
  Vcl.Dialogs,
  Winapi.Windows,
  Winapi.Messages;

{$R *.res}

const
  HookMsg = WM_USER + $0125;
  ID_APP = 'APPHWND';
  ID_HOOK = 'HHOOKID';

//------------------------------------------------------------------------------
// CBTProc
//------------------------------------------------------------------------------
function CBTProc(Code: NativeInt; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
  AppWnd: HWND;
begin
  messagebeep(0);
  AppWnd := GetDesktopWindow();
  if Code > 0 then begin
    Result := 0;
    AppWnd := GetProp(AppWnd, ID_APP);
    PostMessage(AppWnd, HookMsg, wParam, Code);
  end else
    Result := CallNextHookEx(GetProp(AppWnd, ID_HOOK), Code, wParam, lParam)
end;

//------------------------------------------------------------------------------
// SetHook
//------------------------------------------------------------------------------
function SetHook(wnd: hwnd): boolean; export; stdcall;
var
  hwndDsk: HWND;
  HookID: HHOOK;
begin
  hwndDsk := GetDesktopWindow();
  SetProp(hwndDsk, ID_APP, wnd);
  HookID:= SetWindowsHookEx(WH_SHELL, @CBTProc, HInstance, 0);
  SetProp(hwndDsk, ID_HOOK, HookID);
  Result := HookID <> 0;
end;

//------------------------------------------------------------------------------
// UnSetHook
//------------------------------------------------------------------------------
procedure UnSetHook; export; stdcall;
var
  AppWnd: HWND;
  HookID: HHOOK;
begin
  AppWnd := GetDesktopWindow();
  HookID := GetProp(AppWnd, ID_HOOK);
  if HookID <> 0 then
    UnHookWindowsHookEx(HookID);
end;

exports
  SetHook, UnSetHook;

end.


И когда переключаешься между чужими окнами(идёт смена активного окна) бипы слышно, но в ЕХЕ ничего не приходит.
И кстати, кому если понадобится, я нашёл для RegisterShellHookWindow недостающие значение WParam на активное окно

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
//------------------------------------------------------------------------------
// ShellHookMessage
//------------------------------------------------------------------------------
const
  HSHELL_WINDOWCREATED = 1;
  HSHELL_WINDOWDESTROYED = 2;
  HSHELL_WINDOWACTIVATED = 32772;
  HSHELL_FLASH = 32774;



Это было не сложно) 4 поменялась на 32772

Вы msdn читаете? Во первых код который вам показали не совсем корректен. Хорошим тоном вызов CallNextHookEx должен быть всегда, даже когда вы обработали его, иначе следующие ловушки не получат управление.
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644960(v=vs.85).aspx - тут подробный пример, изучив который, все вопросы отпадут.
Посмотрите что у вас с SetProp и GetProp где-то неверно вы что-то кладете туда или вычитываете...
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547934
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-CiteПосмотрите что у вас с SetProp и GetProp где-то неверно вы что-то кладете туда или вычитываете...
Тут всё работает ОК. Проверял значение ID_HookHandle во время работы хука - всё сходится.
код длл сейчас такой:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
library ShellHook;

uses
  System.SysUtils,
  System.Classes,
  Winapi.Windows,
  Winapi.Messages;

{$R *.res}

const
  ID_HookHandle = 'ID_HookHandle';
  ID_AppWnd = 'ID_AppWnd';

var
  HookHandle: integer;
  AppWnd: integer;

  WM_WINDOWCREATED: Cardinal;
  WM_WINDOWDESTROYED: Cardinal;
  WM_WINDOWACTIVATED: Cardinal;

function HookProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  wnd: integer;
begin
  HookHandle := GetProp(GetDesktopWindow, ID_HookHandle);
  AppWnd := GetProp(GetDesktopWindow, ID_AppWnd);

  if (nCode < 0) then
  begin
    Exit;
    Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  end;
  messagebeep(0);

  case nCode of
    HSHELL_WINDOWCREATED: SendMessage(AppWnd, WM_WINDOWCREATED, wParam, 0);
    HSHELL_WINDOWDESTROYED: SendMessage(AppWnd, WM_WINDOWDESTROYED, wParam, 0);
    HSHELL_WINDOWACTIVATED: SendMessage(AppWnd, WM_WINDOWACTIVATED, wParam, 0);
  end;

  //Передаём сообщение дальше по цепочке hook-ов
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;


procedure SetHook(wnd: integer); export; stdcall;
begin
  SetProp(GetDesktopWindow, ID_AppWnd, wnd);
  HookHandle := SetWindowsHookEx(WH_SHELL, @HookProc, HInstance, 0);
  SetProp(GetDesktopWindow, ID_HookHandle, HookHandle);

end;

procedure DellHook; export; stdcall;
begin
  HookHandle := GetProp(GetDesktopWindow, ID_HookHandle);
  UnHookWindowsHookEx(HookHandle);
end;

exports
  SetHook, DellHook;

begin
  WM_WINDOWCREATED := RegisterWindowMessage('ShellHook_WINDOWCREATED');
  WM_WINDOWDESTROYED := RegisterWindowMessage('ShellHook_WINDOWDESTROYED');
  WM_WINDOWACTIVATED := RegisterWindowMessage('ShellHook_WINDOWACTIVATED');
end.




Итак, при открытии, закрытии, активации 32битных приложений бипы слышно всегда, но сообщения в EXE приходят далеко не всегда, т.е. с одними прогами всё работает идеально, с другими нет.
Даже при открытии прог делфи почему то слышно только бипы
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547936
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

Немного в сторону
Код: pascal
1.
2.
3.
4.
5.
if (nCode < 0) then
  begin
    Exit; // и CallNextHookEx пролетела мимо
    Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  end;


Может наоборот?
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39547938
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-CiteMiracle9,

Немного в сторону
Код: pascal
1.
2.
3.
4.
5.
if (nCode < 0) then
  begin
    Exit; // и CallNextHookEx пролетела мимо
    Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  end;


Может наоборот?
Ага, чёт пропустил этот момент)
Но проблема с этим связана не была.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548030
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, в длл, после
Код: pascal
1.
 messagebeep(0);


добавил
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  SL := TStringList.Create;
  begin
    if FileExists('1.txt') then
      SL.LoadFromFile('1.txt');
    SL.Add(AppWnd.ToString + ' ' + nCode.ToString + ' ' + wParam.ToString);
    SL.SaveToFile('1.txt');
  end;
 SL.Free;



Запустил приложение, где бипы слышно, а в ЕXE сообщения не приходят
вот что сохранилось в файл

Код: pascal
1.
2.
3.
4.
5.
6.
788452 16 722510
788452 16 1181860
788452 6 1181860
788452 1 1181860
788452 8 854032
788452 4 1181860


AppWnd верный и остальное всё есть.
По сути получается проблема не в коде ДЛЛ?

Может я где то в ЕХЕ накосячил?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
unit MU;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sMemo, sButton,
  Vcl.ExtCtrls, sPanel;

{для динамической загрузки функций из DLL}
type
  TSetHook = procedure(wnd: integer); stdcall;
  TDellHook = procedure; stdcall;

type
  TMF = class(TForm)
    Memo: TsMemo;
    sPanel1: TsPanel;
    Button1: TsButton;
    Button2: TsButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    procedure WndProc(var Msg: TMessage); override;
  public
    { Public declarations }
  end;

var
  MF: TMF;
  WM_WINDOWCREATED: integer;
  WM_WINDOWDESTROYED: integer;
  WM_WINDOWACTIVATED: integer;

implementation

{$R *.dfm}

var
  ShellHookHandle: HWND = 0; {дескриптор загружаемой DLL}
  SetHook: TSetHook;
  DellHook: TDellHook;

procedure TMF.WndProc(var Msg: TMessage);
begin
  inherited;
  if Msg.Msg = WM_WINDOWCREATED then
    Memo.Lines.Add('WindowCreated: ' + Msg.wParam.ToString);
  if Msg.Msg = WM_WINDOWDESTROYED then
    Memo.Lines.Add('WindowDestroyed: ' + Msg.wParam.ToString);
  if Msg.Msg = WM_WINDOWACTIVATED then
    Memo.Lines.Add('WindowActivated: ' + Msg.wParam.ToString);
 end;

procedure TMF.Button1Click(Sender: TObject);
begin
  @SetHook := nil; // инициализируем переменную hook
  @DellHook := nil;
  ShellHookHandle := LoadLibrary(PChar('ShellHook.dll')); { загрузка DLL }
  if ShellHookHandle > HINSTANCE_ERROR then            { если всё без ошибок, то }
  begin
    @Sethook := GetProcAddress(ShellHookHandle, 'SetHook');     { получаем указатель на необходимую процедуру}
    @Dellhook := GetProcAddress(ShellHookHandle, 'DellHook');
    Sethook(Self.Handle);
  end else
  ShowMessage('Ошибка при загрузке DLL!');
end;

procedure TMF.Button2Click(Sender: TObject);
begin
  DellHook;
end;

procedure TMF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if ShellHookHandle <> 0 then
    FreeLibrary(ShellHookHandle); { при закрытии формы - освобождаем DLL }
end;

{ Регистрируем сообщения }
initialization
  WM_WINDOWCREATED := RegisterWindowMessage('ShellHook_WINDOWCREATED');
  WM_WINDOWDESTROYED := RegisterWindowMessage('ShellHook_WINDOWDESTROYED');
  WM_WINDOWACTIVATED := RegisterWindowMessage('ShellHook_WINDOWACTIVATED');
end.

...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548078
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще, SetProp там был только как пример, чтобы не заморачиваться с чем-то более сложным.

А так, надо иметь в виду, что:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633568(v=vs.85).aspx Before a window is destroyed (that is, before it returns from processing the WM_NCDESTROY message), an application must remove all entries it has added to the property list. The application must use the RemoveProp function to remove the entries.
SetProp is subject to the restrictions of User Interface Privilege Isolation (UIPI). A process can only call this function on a window belonging to a process of lesser or equal integrity level. When UIPI blocks property changes, GetLastError will return 5.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548091
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда у меня dll подгружается в разные процессы, но мне надо засинхронить между всеми dll некоторые данные, то использую только Shared Memory
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548097
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не думаю что проблема в SetProp.
Как видно из последнего поста, все данные, перед отправкой сообщения, имеются.

Сейчас ещё решил проверить так:
1. При установке хука записываю данные в файл.
2. И в функции ловушке открываю, считываю.

Результат тот же.
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548098
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

x86/x64 у приложения и хука совпадают?
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548099
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpMiracle9,

x86/x64 у приложения и хука совпадают?
да, у меня Delphi 10.1 Berlin Starter стоит, там только x86 exe и dll
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548106
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так всё выглядит
[spoiler]
[youtube=
YouTube Video
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548124
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9alekcvpMiracle9,
x86/x64 у приложения и хука совпадают?
да, у меня Delphi 10.1 Berlin Starter стоит, там только x86 exe и dll
А приложение, которое не ловится - тоже x86?
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39548126
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, да, написанное на этой же делфи
...
Рейтинг: 0 / 0
Не устанавливается хук WH_CBT
    #39552825
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как выяснилось, мало того, что битность хука ехе и проги куда устанавливается хук должна совпадать, так ещё и права на запуск (от имени админа без). Короче, полная жопа.
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не устанавливается хук WH_CBT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]