Delphi5, WinXP
1. // Проблема с мышью: В чужом окне кликаю правой мышкой. При этом появляется PopupMenu. Мне это страх
//как ненадо. Хочу вообще отменить правый клик (он мне там в проге не нужен)
//Ан вот не получается.
//Та прога на чьем окне кликаю виснет если я пишу (там где вопросики) WM_MOUSELAST
//или 100000 или что другое. Чего бы ей такое в ответ послать, чтоб меню не
//появлялось (нежное "умри")
2. //Проблема с клвиатурой. Спасибо за подсказку на счет WM_KEYLAST для того чтобы (см. ниже) убивать
//сообщения от нажатия кнопок на клаве. Но вот незадача - как убить нажатие
//кнопки ALT. Она прямо не убиенная какая-то. Я и тка и сяк, а она все жмется и жмется (и левая и правая)
//Как же убить ее клик?
Ответ даже на один из этих вопросов меня крайне обрадует.
Вот листинг библиотеки
Код:
library Dll_KeyboardHook;
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
var
SysHook : HHook = 0; Wnd : Hwnd = 0;
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
CallNextHookEx(SysHook, Code, wParam, lParam); // Передать сообщение другим ловушкам в системе
if code = HC_ACTION then // Проверяю сообщение
begin
Wnd := TMsg(Pointer(lParam)^).hwnd; // Получаю идентификатор окна сгенерировавшего сообщение
//Здесь надо нежно убить сообщение от правой кнопки
//Замена на клик правой и многое другое не прет что то
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then TMsg(Pointer(lParam)^).message:=?????????????????; //WM_MOUSELAST
if TMsg(Pointer(lParam)^).message =WM_KEYDOWN then
begin
Case (TMsg(Pointer(lParam)^).wParam) of
//Эти убивыются
vk_Back: TMsg(Pointer(lParam)^).message:=WM_KEYLAST;
vk_Tab:TMsg(Pointer(lParam)^).message:=WM_KEYLAST;
vk_Clear:TMsg(Pointer(lParam)^).message:=WM_KEYLAST;
//Тут она гадюка неубиенная (и левая и правая)
// vk_Menu:ShowMessage('Alt');//TMsg(Pointer(lParam)^).message:=WM_KEYLAST; //Alt
// VK_LMENU{164}:TMsg(Pointer(lParam)^).message:=WM_KEYLAST; //ShowMessage('Левая Alt');
// VK_RMENU{165}:TMsg(Pointer(lParam)^).message:=WM_KEYLAST;//ShowMessage('Правая Alt');
end;//case
end;
end;
end;
// Процедура запуска.
procedure RunStopHook(State : Boolean) export; stdcall;
begin if State=true then begin
// Запускаем ловушку.
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
end
else
begin
// Отключить ловушку.
UnhookWindowsHookEx(SysHook); SysHook := 0;
end;
end;
exports RunStopHook index 1;
begin
end.
В программе:
Код:
...
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
//Библиотека перехвата клавиатуры и мыши
procedure RunStopHook(State : Boolean) stdcall; external 'DLL_KeyboardHook.dll' index 1;
...
procedure TForm1.FormShow(Sender: TObject);
begin
RunStopHook(true);
end
procedure TForm1.FormDestroy(Sender: TObject);
begin
RunStopHook(false);
end;