Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с Hook - убийцей мыши и клавы [D5, WinXP]


fafCracker ©   (2005-01-18 15:15:00) 

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;


Георгий Бедный   (2005-02-13 14:32:00) [1]

НЕТ.


GrayFace   (2005-01-31 08:38:00) [2]

fafCracker   (18.01.05 15:15)
А ты пробовал ее Restorator'ом (или ResHacker'ом) отучить от правой кнопки?


Георгий Бедный   (2005-01-30 18:24:00) [3]

Спасибо! Попробую.


GrayFace   (2005-01-30 06:04:00) [4]

Георгий Бедный   (29.01.05 22:20) [1]
procedure TForm1.Memo1ContextPopup(Sender: TObject; MousePos: TPoint;
 var Handled: Boolean);
begin
 Handled:=true;
end;


GuAV   (2005-01-29 22:25:00) [5]

WM_NULL ?


Георгий Бедный   (2005-01-29 22:20:00) [6]

У меня похожая история:
Надо сделать такое мемо, где правый клик не вызывает попуп, а выполняет другое действие (у меня копирует строку в буфер). Только убить даже в своей программе никак!


Наверх

Титульная страница Поиск, карта сайта Написать письмо