Форум: "WinAPI";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизНе работает ловушка.... Найти похожие ветки
← →
Катеринка (2007-04-18 12:33) [0]Уже 2 дня бьюсь над созданием ловушки под Windows
Вроде и длл-ка подключается, а эффекта никакого. Помогите, плз.
Это код dll:library SendKey;
uses
SysUtils,
Classes,
WinTypes, WinProcs, Messages;
{$R *.res}
const //пользовательские сообщения
wm_NextShow_Event = wm_User + 133;
wm_PrevShow_Event = wm_User + 134;
var
SaveExitProc : Pointer;
//handle для ловушки
HookHandle: hHook =0;
{=====================собственно ловушка====================}
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint; export; stdcall;
var
H: HWND;
begin
//если Code>=0, то ловушка может обработать событие
if Code >= 0 then
begin
//это те клавиши?
if ((wParam = VK_ADD)or(wParam = VK_SUBTRACT)) and (lParam and $40000000 = 0) then
begin
//ищем окно по имени класса и по заголовку
H:= FindWindow("TfmMain", "Neuro");
//посылаем сообщение
if wParam = VK_ADD then SendMessage(H, wm_NextShow_Event, 0, 0)
else SendMessage(H, wm_PrevShow_Event, 0, 0);
end;
//если 0, то система должна дальше обработать это событие
//если 1 - нет
Result:=0;
end
else
//если Code<0, то нужно вызвать следующую ловушку
Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;
{============при выгрузке DLL надо снять ловушку============}
procedure LocalExitProc; far; stdcall;
begin
if HookHandle<>0 then
begin
UnhookWindowsHookEx(HookHandle);
ExitProc := SaveExitProc;
end;
end;
{=========инициализация DLL при загрузке ее в память========}
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 MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, Menus,
JvComponentBase, JvTrayIcon, StdCtrls;
const //пользовательские сообщения
wm_NextShow_Event = wm_User + 133;
wm_PrevShow_Event = wm_User + 134;
type
TfmMain = class(TForm)
....................................
Label1: TLabel;
....................................
private
//обработчики сообщений
procedure WM_NextMSG (Var M : TMessage); message wm_NextShow_Event;
procedure WM_PrevMSG (Var M : TMessage); message wm_PrevShow_Event;
public
end;
var
P: Pointer;
fmMain: TfmMain;
.....................................
implementation
...............................
{$R *.dfm}
...............................
{==========================================================}
{Часть программы, отвечающая за перехват нажатий клавиш
в Windows}
{========================загрузка DLL=======================}
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint; stdcall; far; external "SendKey.dll";
procedure TfmMain.WM_NextMSG (Var M : TMessage);
begin
Label1.Caption:="Next message";
//MessageDlg("+",mtError,[mbOk],0);
end;
procedure TfmMain.WM_PrevMSG (Var M : TMessage);
begin
Label1.Caption:="Previous message";
//MessageDlg("-",mtError,[mbOk],0);
end;
{===========================================================}
procedure TfmMain.FormCreate(Sender: TObject);
begin
................
P:=@Key_Hook
// так указано в учебнике, якобы для того чтоб dll не выгрузилась из памяти, т.к. не используется или что-то //вроде того. Но с этой строкой выдается ошибка работы приложения, а без нее приложение запускается, но
// с Label1 не происходит ни каких изменений
end;
end.
← →
Сергей М. © (2007-04-18 12:55) [1]Задача-то твоя как звучит ?
Судя по твоему коду DLL для решения задачи вооще не нужна ..
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.043 c