powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не устанавливается хук WH_CBT
19 сообщений из 44, страница 2 из 2
Не устанавливается хук 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
19 сообщений из 44, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не устанавливается хук WH_CBT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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