Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Правая кнопка мыши


Автор: JohnnY 23.8.2005, 00:24
Я хотел узнать как можно сделать так чтобы при нажатии правой кнопки мыши на рабочем столе в моей программе выполнялось какое-либо действие???

Автор: FRAGNATIC 23.8.2005, 00:52
hook те в помощь
Добавлено @ 00:56
Код

ibrary Mouse2Hook;
Uses Windows,Messages, Controls;
const
  WM_MESSAGE_FROM_MY_HOOK = WM_USER + $AA;

Var SysHook:HHook=0; 

Function SysMsgProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall; 
Var Msg:TMessage;
Begin 
 IF Code=HC_ACTION then 
  Case TMsg(Pointer(LParam)^).Message OF
   WM_RBUTTONDOWN,WM_RBUTTONUP,WM_RBUTTONDBLCLK:
   begin
     TMsg(Pointer(LParam)^).Message:=WM_NULL;
     PostMessage(FindWindow('TForm1',nil), WM_MESSAGE_FROM_MY_HOOK, Mouse.CursorPos.X, Mouse.CursorPos.Y);
   end;
   else Result:=CallNextHookEx(SysHook,Code,WParam,LParam);
  End;
end;

procedure Hook(Flag:Boolean); export; stdcall; 
Begin 
 IF Flag then SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0) Else 
  Begin
   UnhookWindowsHookEx(SysHook);
   //SysHook:=0;
  End; 
End; 

exports Hook; 

{$R *.res} 

begin 
end.


код проги
Код

-------------------
const
  WM_MESSAGE_FROM_MY_HOOK = WM_USER + $AA;

type 
  MyProcType = procedure (Flag: Boolean); stdcall;
----------------
  private
    procedure WM_MSG_FROM_HOOK(var msg: TMessage); message WM_MESSAGE_FROM_MY_HOOK;
-------------------------
procedure TForm1.WM_MSG_FROM_HOOK(var msg: TMessage);
begin
  //SetForegroundWindow(application.Handle);
  делай чё те надо тут)
  //PostMessage(Handle,WM_NULL,0,0);
end;

Добавлено @ 01:00
правда это везде будет похать не тока на раб столе! Но для раб стола мож переделать сделав проверку или ещё чёнить! думаю справишся сам)

Автор: RaIDeR 23.8.2005, 01:02
Самый простой способ это использовать ф-цию GetAsyncKeyState,
но не самый надёжный ... один плюсь - отвязка от dll.
(с использованием таймера, интервал поставь по-меньше)

Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (GetAsyncKeyState(2) = - 32767) then Memo1.Lines.Add('click');
end;

Автор: FRAGNATIC 23.8.2005, 01:10
Цитата
но не самый надёжный

скорее совсем не надёжный)

Автор: RaIDeR 23.8.2005, 01:17
Цитата

скорее совсем не надёжный)

Срабатывает со второго клика, - c момента получения окном фокуса(если первый клик был тоже правый, а так всё ок smile )

Автор: Rrader 24.8.2005, 02:29
Надо внедриться в explorer.exe и засабклассить рабочий стол. smile Тогда можно будет отслеживать все...

Автор: FRAGNATIC 24.8.2005, 03:11
Цитата
Тогда можно будет отслеживать все...

с помощью хука можно так же отслеживать всё!

Автор: Rrader 24.8.2005, 04:02
Цитата

с помощью хука можно так же отслеживать всё!

Как ты будешь определять, что сообщения послал Рабочий стол? smile

Автор: FRAGNATIC 24.8.2005, 13:38
Цитата
что сообщения послал Рабочий стол?

можно определять над чем находится курсор мыши!
и есть ещё куча вариантов!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)