Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1

Избитая тема о хуках

07.03.2012, 17:45. Показов 8284. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужно поставить хук на мышу. прочитал несколько умных статей о хуках.
написал ДЛЛ с хук-процедурой, для мониторинга хука посылаю сообщение WM_USER
приложению-монитору. Вроде все по учебнику, так сказать. Но хук работает только
когда курсор находится в пределах окна приложения, вызвавшего ДЛЛ с хук-процедурой.
В чем трабл? с клавиатурным хуком (WH_KEYBOARD) та же фигня...

код библиотеки
Delphi
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
library HookLib;
 
uses
  Windows,
  Dialogs,
  Messages;
 
var
  // хэндл окна, которому посылаем сообщение из хук-процедуры
  LogHWND: THandle;
  HOOK_HANDLE: HHOOK;
 
function MouseHook(Code: integer; WParam,LParam: DWORD): DWORD; stdcall;
begin                
  // -- цитата из справки Delphi --
  {wParam
     Specifies the identifier of the mouse message. }
  Result:= CallNextHookEx(HOOK_HANDLE,Code,WParam,LParam);
  if Code = HC_ACTION then
  // посылаю окну сообщение с указанием идентификатора мышиного
  // события (WParam)
  SendMessage(LogHWND,WM_USER,WParam,0);
end;
 
procedure SetMouseHook(LogWindow: THandle);
begin
  LogHWND:= LogWindow;
  HOOK_HANDLE:= SetWindowsHookEx(WH_MOUSE,@MouseHook,HInstance,0);
end;
 
procedure UnHook;
begin
  if HOOK_HANDLE <> 0 then begin
    UnHookWindowshookEx(HOOK_HANDLE);
    HOOK_HANDLE:= 0;
  end;
end;
 
exports
  SetMouseHook, UnHook;
 
begin
  LogHWND:= 0;
  HOOK_HANDLE:= 0;
end.
модуль интерфейса библиотеки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
unit HookLib_Int;
 
interface
 
uses
  Windows;
 
  procedure SetMouseHook(LogWindow: THandle); external 'HookLib.dll';
  procedure UnHook; external 'HookLib.dll';
 
implementation
 
end.
код приложения-монитора
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure WMUser(var Msg: TMessage); message WM_USER;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses HookLib_Int;
 
{$R *.dfm}
 
procedure TForm1.FormShow(Sender: TObject);
begin          
  // посылаю ДЛЛ свой хэндл
  SetMouseHook(Handle);
end;
 
procedure TForm1.WMUser(var Msg: TMessage);
begin
  // принимаю из хук-процедуры идентификатор
  // мышиного события
  inherited;
  Memo1.Lines.Add(IntToStr(Msg.WParam));
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnHook;
end;
 
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2012, 17:45
Ответы с готовыми решениями:

Избитая тема про StringGrid и числовую матрицу
Подскажите пожалуйста, каким образом числовую матрицу из текстового файла отобразить в StringGrid. Если не сложно то было бы хорошо...

избитая тема кирилицы в qt
Вот уже ничего не могу понять: QStringList codecs; codecs.append(&quot;IBM 866&quot;); codecs.append(&quot;KOI8-R&quot;); ...

Избитая тема Treeview
Всем доброго дня! Улучшаю сделанную своими руками БД в MS Access и пришел к выводу, что без &quot;дерева&quot; (Treeview) не обойтись....

21
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
07.03.2012, 17:56
мож хендл десктопа отправлять
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
07.03.2012, 18:22  [ТС]
Цитата Сообщение от БогДелфей Посмотреть сообщение
мож хендл десктопа отправлять
да при чем тут десктоп, не прикалуйся
согласно умным словам, при установке хука третий параметр процедуры SetWindowsHookEx должен быть идентификатором библиотеки, в которой находится хук-процедура, четвертый параметр - ноль если хук ставится на всю систему. эти условия я соблюдаю, но хук работает только когда курсор над окном приложения-монитора.

Добавлено через 2 минуты
SetMouseHook(Handle);
Handle я опраляю лишь для того, чтобы не искать его через FindWindow. На работу хука он не влияет

Добавлено через 5 минут
попутный вопрос

Code
1
2
3
4
5
6
7
8
9
LRESULT CALLBACK MouseProc(
 
    int nCode,  // hook code
    WPARAM wParam,  // message identifier
    LPARAM lParam   // mouse coordinates
   );
...
lParam
  Points to a MOUSEHOOKSTRUCT structure.
т.е. lParam является адресом, по которому находится структура MOUSEHOOKSTRUCT,
которая по сути есть запись (packed record). Так вот, как, зная адрес, обратиться
к самой записи? Я в адресах немного путаюсь

Добавлено через 10 минут
вот сколько встречал статей о хуках, практически все являются копипастом и начинаются со слов
Тема про хуки является популярной на многих форумах программистов. Материал этих статей рассчитан на начинающего пользователя, примеры будут на Delphi. В этой статье будут изложены основные принципы механизма хуков, и будет написан пример клавиатурного шпиона.


Добавлено через 1 минуту
Может, еще это имеет значение? использую D7 под WinXP Pro SP3.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
07.03.2012, 18:24
SetMouseHook(Handle);
Handle я опраляю лишь для того, чтобы не искать его через FindWindow
возверни findWindow(nil, caption главного окна) в DLL и все заработает
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
07.03.2012, 18:38  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
возверни findWindow(nil, caption главного окна) в DLL и все заработает
бл..., заработало но в чем причина? Ведь передаваемый параметр ни на что не влиял?
остается вопрос по поводу MOUSEHOOKSTRUCT
0
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
07.03.2012, 18:51
через точку не пробовал?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
07.03.2012, 21:09  [ТС]
Цитата Сообщение от БогДелфей Посмотреть сообщение
через точку не пробовал?
причем тут точка?
lParam - это число типа DWORD. однако это число является адресом переменной (типа record) в памяти. Как обратиться к этой переменной?

Добавлено через 1 час 56 минут
я почти разобрался в вопросе, вот только последний ЖОСТКИЙ баг остался.
итак, напомню, мне нужен доступ по адресу к структуре MOUSEHOOKSTRUCT

Цитата Сообщение от DenNik Посмотреть сообщение
Code
1
2
3
4
5
6
7
8
9
LRESULT CALLBACK MouseProc(
 
    int nCode,  // hook code
    WPARAM wParam,  // message identifier
    LPARAM lParam   // mouse coordinates
   );
...
lParam
  Points to a MOUSEHOOKSTRUCT structure.
т.е. lParam является адресом, по которому находится структура MOUSEHOOKSTRUCT,
которая по сути есть запись (packed record).
Delphi
1
2
3
4
5
6
tagMOUSEHOOKSTRUCT = packed record
    pt: TPoint;
    hwnd: HWND;
    wHitTestCode: UINT;
    dwExtraInfo: DWORD;
  end;
в хук-процедуре я делаю так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
function MouseHook(Code: integer; WParam,LParam: DWORD): DWORD; stdcall;
var
  LogHWND: THandle;
begin
  if Code = HC_ACTION then
  begin
    LogHWND:= FindWindow(nil,'Hook_Log');
    if LogHWND <> 0 then
    SendMessage(LogHWND,WM_USER,WParam,LParam);
  end;
  Result:= CallNextHookEx(HOOK_HANDLE,Code,0,LParam);
end;
т.е. lParam есть указатель на вышеназванную структуру. Это значение я передаю в приложение-монитор при помощи сообщения WM_USER так же в поле lParam. В приложении я принимаю сообщение и обрабатываю его так
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.WMUser(var Msg: TMessage);
var
  M: TMouseHookStruct;
begin
  M:= PMouseHookStruct(Msg.LParam)^;
  Label1.Caption:= 'X: ' + IntToStr(M.pt.X);
  Label2.Caption:= 'Y: ' + IntToStr(M.pt.Y);
end;
т.е. здесь я хочу отобразить значения координат курсора, которые мне передала хук-процедура.
но! когда курсор находится НЕ над окном, происходит ACCESS VIOLATION Почему это происходит?
если убрать все операторы из процедуры WMUser, никаких ошибок.
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
08.03.2012, 01:00
а на кой тебе dll? если ты ставишь хук на мышь или клаву можно и без dll обойтись, воспользоваться так называемым LL хуком, принцип тот же только вместо WH_MOUSE нужно передать 14 (для клавы 13)
подробности в msdn
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.03.2012, 13:28  [ТС]
Цитата Сообщение от anonimus Посмотреть сообщение
а на кой тебе dll? если ты ставишь хук на мышь или клаву можно и без dll обойтись, воспользоваться так называемым LL хуком, принцип тот же только вместо WH_MOUSE нужно передать 14 (для клавы 13)
подробности в msdn
все пишут, что при установке хука на всю систему нужно только из ДЛЛ. ладно, я попробую...
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
08.03.2012, 13:44
если хук на мышь или клаву то можно и без dll обойтись, на остальные виды хуков нужна dll
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.03.2012, 14:04  [ТС]
Цитата Сообщение от DenNik Посмотреть сообщение
т.е. здесь я хочу отобразить значения координат курсора, которые мне передала хук-процедура.
но! когда курсор находится НЕ над окном, происходит ACCESS VIOLATION Почему это происходит?
если убрать все операторы из процедуры WMUser, никаких ошибок.
я вроде понял причину. Когда курсор находится над окном установившего хук приложения, хук-процедура срабатывает в том же процессе, что и окно, иначе она срабатывает в другом процессе, и естественно, адрес структуры MOUSEHOOKSTRUCT принадлежит адресному пространству другого процесса, из-за чего и возникает ошибка. Верно, гуру?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.03.2012, 16:36  [ТС]
Цитата Сообщение от anonimus Посмотреть сообщение
если хук на мышь или клаву то можно и без dll обойтись, на остальные виды хуков нужна dll
да, все работает. В отличие от WH_MOUSE, WH_MOUSE_LL работает без ДЛЛ.
Также решил проблему доступа к записи по адресу, когда хук работает в ДЛЛ. для этого
в ДЛЛ создаю копию структуры, адрес которой передает хук-процедура, и уже указатель
на эту копию передаю в приложение-монитор.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.03.2012, 17:28  [ТС]
Цитата Сообщение от DenNik Посмотреть сообщение
lParam есть указатель на вышеназванную структуру. Это значение я передаю в приложение-монитор при помощи сообщения WM_USER так же в поле lParam. В приложении я принимаю сообщение и обрабатываю его так
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.WMUser(var Msg: TMessage);
var
  M: TMouseHookStruct;
begin
  M:= PMouseHookStruct(Msg.LParam)^;
  Label1.Caption:= 'X: ' + IntToStr(M.pt.X);
  Label2.Caption:= 'Y: ' + IntToStr(M.pt.Y);
end;
т.е. здесь я хочу отобразить значения координат курсора, которые мне передала хук-процедура.
но! когда курсор находится НЕ над окном, происходит ACCESS VIOLATION Почему это происходит?
если убрать все операторы из процедуры WMUser, никаких ошибок.
Цитата Сообщение от DenNik Посмотреть сообщение
я вроде понял причину. Когда курсор находится над окном установившего хук приложения, хук-процедура срабатывает в том же процессе, что и окно, иначе она срабатывает в другом процессе, и естественно, адрес структуры MOUSEHOOKSTRUCT принадлежит адресному пространству другого процесса, из-за чего и возникает ошибка. Верно, гуру?
вышеописанные баги происходят при установке хука WH_MOUSE. с WH_MOUSE_LL таких проблем нет
Цитата Сообщение от DenNik Посмотреть сообщение
Также решил проблему доступа к записи по адресу, когда хук работает в ДЛЛ. для этого
в ДЛЛ создаю копию структуры, адрес которой передает хук-процедура, и уже указатель
на эту копию передаю в приложение-монитор.
поэтому так можно не делать, а сразу передвать адрес

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


код библиотеки
Delphi
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
library HookLib;
 
uses
  Windows, Messages;
 
const
  // объявляю, поскольку в Делфи 7 этой константы нет
  WH_MOUSE_LL = 14;
var
  HOOK_HANDLE: HHOOK;
 
// хук-процедура
function MouseHook(Code: integer; WParam,LParam: wparam): DWORD; stdcall;
var
  LogHWND: THandle;
begin
  if Code = HC_ACTION then
  case WParam of
  // фильтр мышиных событий (по правде, здесь они все :)
  WM_MOUSEMOVE..WM_MOUSEWHEEL:
    begin
      LogHWND:= FindWindow(nil,'Hook_Log');
      if LogHWND <> 0 then
      SendMessage(LogHWND,WM_USER,WParam,LParam);
    end;
  end;
  Result:= CallNextHookEx(HOOK_HANDLE,Code,WParam,LParam);
end;
 
procedure SetMouseHook;
begin
  HOOK_HANDLE:= SetWindowsHookEx(WH_MOUSE_LL,@MouseHook,HInstance,0);
end;
 
procedure UnHook;
begin
  if HOOK_HANDLE <> 0 then begin
    UnHookWindowshookEx(HOOK_HANDLE);
    HOOK_HANDLE:= 0;
  end;
end;
 
exports
  SetMouseHook, UnHook;
 
begin
  HOOK_HANDLE:= 0;
end.
модуль интерфейса
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
unit HookLib_Int;
 
interface
 
uses
  Windows;
 
  procedure SetMouseHook; external 'HookLib.dll';
  procedure UnHook; external 'HookLib.dll';
 
implementation
 
end.
структура tagMSLLHOOKSTRUCT
описание структуры здесь: MSLLHOOKSTRUCT structure
в Делфи 7 она не описана, поэтому делаю сам
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
unit MSLLHookStruct;
 
interface
 
uses
  Windows;
 
type
  PtagMSLLHookStruct = ^tagMSLLHOOKSTRUCT;
  tagMSLLHOOKSTRUCT = packed record
    pt: TPoint;
    mouseData: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: Cardinal;
  end;
 
implementation
 
end.
приложение-монитор
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure WMUser(var Msg: TMessage); message WM_USER;
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses HookLib_Int, MSLLHookStruct;
 
{$R *.dfm}
 
var
  HookData: tagMSLLHOOKSTRUCT;
 
procedure TForm1.WMUser(var Msg: TMessage);
begin
  HookData:= PtagMSLLHookStruct(Msg.LParam)^;
  // читаем координаты курсора
  Label2.Caption:= 'X: ' + IntToStr(HookData.pt.X);
  Label3.Caption:= 'Y: ' + IntToStr(HookData.pt.Y);
  // определяем тип мышиного события
  case Msg.WParam of
  WM_MOUSEMOVE: Label1.Caption:= 'Движение';
  WM_LBUTTONDOWN: Label1.Caption:= 'Нажата левая кнопка';
  WM_LBUTTONUP: Label1.Caption:= 'Отпущена левая кнопка';
  WM_LBUTTONDBLCLK: Label1.Caption:= 'Двойной щелчок левой';
  WM_RBUTTONDOWN: Label1.Caption:= 'Нажата правая кнопка';
  WM_RBUTTONUP: Label1.Caption:= 'Отпущена правая кнопка';
  WM_RBUTTONDBLCLK: Label1.Caption:= 'Двойной щелчок правой';
  WM_MBUTTONDOWN: Label1.Caption:= 'Нажата средняя кнопка';
  WM_MBUTTONUP: Label1.Caption:= 'Отпущена средняя кнопка';
  WM_MBUTTONDBLCLK: Label1.Caption:= 'Двойной щелчок средней';
  WM_MOUSEWHEEL: Label1.Caption:= 'Прокрутка колеса';
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetMouseHook;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnHook;
end;
 
end.
Добавлено через 10 минут
единственно, хук не ловит двойной щелчок, вместо этого происходит два одинарных, как быстро бы я ни клацал
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
08.03.2012, 18:00
зачем ты в dll используешь WH_MOUSE_LL ? если уж ты ставишь LL хук то dll тебе НЕ НУЖНА код пиши в своем exe, если уж ты делаешь с dll то тебе нужно передавать WH_MOUSE а не WH_MOUSE_LL
это первое.
Второе, если ты ставишь глобальный хук правильнее нужно было бы использовать mmf (memory mapped files)
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.03.2012, 18:24  [ТС]
Цитата Сообщение от anonimus Посмотреть сообщение
зачем ты в dll используешь WH_MOUSE_LL ? если уж ты ставишь LL хук то dll тебе НЕ НУЖНА код пиши в своем exe, если уж ты делаешь с dll то тебе нужно передавать WH_MOUSE а не WH_MOUSE_LL
это первое.
Второе, если ты ставишь глобальный хук правильнее нужно было бы использовать mmf (memory mapped files)
я понял тебя еще раньше. Просто я привел пример с использованием ДЛЛ, ведь это не запрещено.
в MSDN сказано
An application-defined or library-defined callback function...
http://msdn.microsoft.com/en-u... s.85).aspx
это первое.

Второе. Объясни, почему мне нужно использовать mmf, а не так как я сделал. В чем преимущество?
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
08.03.2012, 18:26
Цитата Сообщение от DenNik Посмотреть сообщение
Объясни, почему мне нужно использовать mmf
потому что dll загружается в чужое АП процесса, поэтому глобальные переменные в частности HOOK_HANDLE должны быть в mmf, что бы не было неприятностей в процессе работы программы.
Ну это было бы правильно, если тебя устраивает свой код, тогда не заморачивайся.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.03.2012, 18:41  [ТС]
Цитата Сообщение от anonimus Посмотреть сообщение
потому что dll загружается в чужое АП процесса, поэтому глобальные переменные в частности HOOK_HANDLE должны быть в mmf, что бы не было неприятностей в процессе работы программы.
Ну это было бы правильно, если тебя устраивает свой код, тогда не заморачивайся.
Хорошо, какого плана ошибка может возникнуть? Пока у меня все работает. Или это важно для многопроцессорных систем? Или в моем случае не происходит выгрузка хука процедурой UnHook? Хотя после завершения приложения проверяю ДЛЛ, она свободна. В общем, просвети.

Добавлено через 3 минуты
пока единственная замеченная мной неприятность возникала, когда я пытался передать в ДЛЛ хэндл вызвавшего окна (см. мой первый пост). Теперь я понял, в чем была проблема (различные АП)

Добавлено через 4 минуты
если есть хорошая ссылка на MMF (кроме MSDN ) на русском, скинь.
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
22.12.2014, 11:56
DenNik, Мне тоже нужен рабочий хук WH_LL_MOUSE, только делательно без dll-ки
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
06.01.2015, 18:42
DenNik,
У вас что нибудь получилось, то что вы делали в 13 посте? Удалась ли передача координат курсора в лейблы?

anonimus, зачем ты в dll используешь WH_MOUSE_LL ? если уж ты ставишь LL хук то dll тебе НЕ НУЖНА код пиши в своем exe...
Во вобще хороший расклад событий! А как это сделать?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
06.01.2015, 18:58  [ТС]
NIKOLAYY, хз ))))) давно это было. я делал это в качестве тренировки. судя по тому, что я привел окончательный вариант, наверное получилось.

Цитата Сообщение от NIKOLAYY Посмотреть сообщение
А как это сделать?
ну просто описать все в одном приложении установка хука - по нажатию кнопки, снятие - по нажатию другой и обязательно при закрытии приложения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2015, 18:58
Помогаю со студенческими работами здесь

Избитая тема - перетаскивание формы
Добрый день всем! Вопрос такой, облазил уже весь интернет, но не могу найти то что надо. Есть форма, на ней куча контролов, которые...

Знаю что тема избитая но - ХП на ВИСТУ
Ноутбук АСУС точную модель сказать не могу - не мой. Была установлена Виста которая блогополучна сдохла - не грузиться не рекавериться...

Восстановление после clean (избитая тема)
И так, господа. Есть физ. носитель на 1 тб (где то 980 гб юзабельного пространства). Был в разметке MRB. Было 2 раздела. Первый на 100 ГБ...

Избитая тема про блокировку по условию
Прочитал на форуме о блокировке полей и форм по условию и никак не получается применить для своей базёнки. Короче о проблеме: в...

Как сохранить string данные в DOC,PDF (избитая тема)?
Всем доброго времени суток. Есть класс контейнер в котором храняться данные я через ovveride ToString() все их собираю. И через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru