Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   *Юный техник* | Помогите с Hook - убийцей мыши и клавы (http://forum.oszone.net/showthread.php?t=44019)

SASHA 333 18-01-2005 15:17 289707

*Юный техник* | Помогите с Hook - убийцей мыши и клавы
 
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;


hasherfrog 15-02-2005 12:58 298498

Кейлоггер на дельфи. Вдруг кому ещё надо :)
http://www.delphifr.com/code.aspx?ID=29357

Kroc 21-02-2005 01:50 300294

SASHA 333[/b]
А попробуй не выпускать сообщение из ловушки...
Для этого твоя функция SysMsgProc должна вернуть ненулевое значение.


Время: 13:47.

Время: 13:47.
© OSzone.net 2001-