-
Нашел пример хука (должен отлавливать нажатия клавиш + и -), но при запуске Project1.exe выдаёт ошибку: Ошибка при инициализации приложения (0xc000007b). Для выхода из приложения нажмите кнопку "ОК"
Текст модулей следующий:
library lib;
uses WinTypes, WinProcs, Messages;
const {пользовательские сообщения} wm_NextShow_Event = wm_User + 133; wm_PrevShow_Event = wm_User + 134; {handle для ловушки} //HookHandle: hHook = 0;
var SaveExitProc : Pointer; HookHandle: hHook = 0; {собственно ловушка} function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint; export; var H: HWND; begin {если Code>=0, то ловушка может обpаботать событие} if Code >= 0 then begin {это те клавиши?} if ((wParam = VK_ADD)or(wParam = VK_SUBTRACT)) and (lParam and $40000000 = 0) then begin {ищем окно по имени класса и по заголовку} H := FindWindow('TForm1', 'XXX'); {посылаем сообщение} if wParam = VK_ADD then SendMessage(H, wm_NextShow_Event, 0, 0) else SendMessage(H, wm_PrevShow_Event, 0, 0); end; {если 0, то система должна дальше обpаботать это событие} {если 1 - нет} Result:=0; end else {если Code<0, то нужно вызвать следующую ловушку} Result := CallNextHookEx(HookHandle,Code, wParam, lParam); end;
{пpи выгpузке DLL надо снять ловушку} procedure LocalExitProc; far; begin if HookHandle<>0 then begin UnhookWindowsHookEx(HookHandle); ExitProc := SaveExitProc; end; end;
{инициализация DLL пpи загpузке ее в память} begin {устанавливаем ловушку} HookHandle := SetWindowsHookEx(wh_Keyboard, Key_Hook, hInstance, 0); if HookHandle = 0 then MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok) else begin SaveExitProc := ExitProc; ExitProc := @LocalExitProc; end; end.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const wm_NextShow_Event = wm_User + 133; wm_PrevShow_Event = wm_User + 134;
type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } procedure WM_NextMSG (Var M : TMessage); message wm_NextShow_Event; procedure WM_PrevMSG (Var M : TMessage); message wm_PrevShow_Event; public { Public declarations } end;
var Form1: TForm1; P : Pointer; implementation
{$R *.dfm} function Key_Hook : Longint; far; external 'lib.dll';
procedure TForm1.FormCreate(Sender: TObject); begin
P:=@Key_Hook; end;
procedure TForm1.WM_NextMSG(var M: TMessage); begin Label1.Caption:='Next message'; end;
procedure TForm1.WM_PrevMSG(var M: TMessage); begin Label1.Caption:='Previous message'; end;
end.
В чем ошибка?
-
-
> [20] dymok © (27.10.08 17:26) > Нашел пример хука (должен отлавливать нажатия клавиш + и -), но при запуске Project1.exe выдаёт ошибку: > Ошибка при инициализации приложения (0xc000007b). Для выхода из приложения нажмите кнопку "ОК"
1. А почему не воспользоваться GetLastInputInfo ? (писала по памяти - возможны ошибки) 2. А не кажется ли Вашему начальству, что после установки вот таких вот программ на каждый компьютер и начнутся настоящие простои ? :)
-
> Нашел пример хука
Это не тот пример. Ищи пример для WH_LL_KEYBOARD и WH_LL_MOUSE
-
> clickmaker © (27.10.08 17:43) [21] а потом появляются > такие темы:http://pda.delphimaster.net/?n=3&id=1224709773
Не вижу никаких аналогий. Но на всякий случай, я работаю на отечественном машиностроительном предприятии. Решаемая сейчас задача - каприз руководства. До этого все написанные проекты немного другие и связаны с Oracle+Delphi.
> Riply © (27.10.08 18:03) [22]
> А почему не воспользоваться GetLastInputInfo? 2. А не кажется ли Вашему начальству, что после установки вот таких вот программ на каждый компьютер и начнутся настоящие простои ? :)
1)А действительно, почему бы не использовать GetLastInputInfo? Как это мне никто раньше не подсказал эту апишку. Особенно если загнать ее в службу, а? Сейчас попробую. А то уже голову сломал с этими хуками :) 2) а почему начнутся простои? :)
> Сергей М. © (28.10.08 09:39) [23] Это не тот пример.Ищи пример для WH_LL_KEYBOARD и WH_LL_MOUSE
В модуле Windows.pas вообще отсутствуют эти LL, есть только обычные WH_KEYBOARD и WH_MOUSE. Где их искать то?
-
> В модуле Windows.pas вообще отсутствуют эти LL
Потому что писан он был еще во времена Win9x/Me, где LL-хуков не было.
> Где их искать то?
WH_KEYBOARD_LL = 13 WH_MOUSE_LL = 14
Реализация хука в отдельном dll-модуле НЕ требуется
-
-
HKEY_PERFORMANCE_DATA
-
> dymok (28.10.2008 11:02:24) [24]
> 2) а почему начнутся простои? :)
Дело чести, обмануть железяку.
-
> [24] dymok © (28.10.08 11:02) > а почему начнутся простои? :)
см. [28] Anatoly Podgoretsky :)
> Offtop У нас, примерно год назад, внедряли что-то подобное. Оно "вопросы спрашивало, надо было ответы отвечать" :) Так вот, я почти день истратила на написание автоматической отвечалки :) (Там перехват нужен был) Как ты думаешь, этот день можно отнести к "простоям" ? P.S. Да еще и поделилась отвечалкой со своими знакомыми :)
-
> Riply (28.10.2008 13:45:29) [29]
А против обычного простоя книгой борются, толстой.
-
Удалено модератором
-
-
Alex22 (15.07.09 22:11) [32]
Ну хоть автора указали, и то хлеб. Хотя я этому сайту никаких прав на распространение не давал.
-
function SecondsIdle: DWord;
var
liInfo: TLastInputInfo;
begin
liInfo.cbSize := SizeOf(TLastInputInfo) ;
liInfo.dwTime
GetLastInputInfo(liInfo) ;
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end;
Всё уже придумано за вас :-D
|