Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Как программно отлавить наведение мыши на иконку на раб. столе?   Найти похожие ветки 

 
Ната   (2004-12-09 10:53) [0]

Пожалуйста, не могли бы Вы мне подсказать как программно отлавить событие наведение мыши на иконку на раб. столе?


 
Ната   (2004-12-09 11:55) [1]

ну хотя бы киньте ссылку где об этом точно можно найти..


 
Leonid Troyanovsky   (2004-12-09 12:30) [2]


> Ната   (09.12.04 10:53)  
> Пожалуйста, не могли бы Вы мне подсказать как программно
> отлавить событие наведение мыши на иконку на раб. столе?


Как сабклассировать чужое окно см тред:

http://delphimaster.net/view/4-1102135227/

Нужное окно - это SysListView32 "внук" Progman
находится, например, так:


function GetSysListView32: HWND;
begin
Result := FindWindow("Progman", nil);
Result := FindWindowEx(Result, 0, nil, nil);
Result := FindWindowEx(Result, 0, nil, nil);
end;


Нужное событие - это, видимо, определение кто под курсором
при WM_MOUSEMOVE (WindowFromPoint, LVM_GETITEMRECT).

--
С уважением, LVT.


 
Ната   (2004-12-09 13:59) [3]

а нет ли более простых путей?


 
Leonid Troyanovsky   (2004-12-09 14:29) [4]


> Ната   (09.12.04 13:59) [3]
> а нет ли более простых путей?


Можно без сабклассирования.
Попробуй SetWindowsHookEx WH_GETMESSAGE (в dll),
устанавливаемый на поток Explorer (где SysListView32).
На тот же WM_MOSEMOVE.

--
С уважением, LVT.


 
grom   (2004-12-09 19:20) [5]

программно отлавить наведение мыши на иконке своей программы?


 
Ната   (2004-12-10 09:43) [6]

не обязательно своей, на любой


 
grom   (2004-12-10 13:37) [7]

Если на своей иконке то можно так:
var sX, sY: Integer;
procedure TForm1.Ico(var M:TMessage);
begin
if M.WParam=1 then
case M.LParam of
WM_RBUTTONUP : PopupMenu1.Popup(Mouse.CursorPos.x,Mouse.CursorPos.y);
WM_MOUSEMOVE: begin
sX:= Mouse.CursorPos.x;
sY:= Mouse.CursorPos.y;
if Timer1.Enabled then exit;
Timer1.Enabled:=true;
Caption:="Mouse YES";
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (Mouse.CursorPos.x <> sX) or (Mouse.CursorPos.y <> sY) then begin
Caption:="Mouse NO";
Timer1.Enabled:=False;
end;
end;


 
Leonid Troyanovsky   (2004-12-10 14:33) [8]


> Ната   (10.12.04 09:43) [6]
> не обязательно своей, на любой


Ну, чего не получилось?
Держи:


library lib3;

uses
 Messages,
 Windows,
 commctrl;

var
 AHook: HHOOK;
 Caller : HWND;
 ListWnd: HWND;

function GetSysListView32: HWND;
begin
 Result := FindWindow("Progman", nil);
 Result := FindWindowEx(Result, 0, nil, nil);
 Result := FindWindowEx(Result, 0, nil, nil);
end;

function HookProc( nCode: Integer; wprm: WParam; lprm:WParam):LResult;
        stdcall;
type
 PMsg = ^TMsg;
var
 msg : PMsg;
 i, id: Longint;
 ARect : TRect;
begin
 msg := PMsg(lprm);

 case msg.Message of
   WM_NULL:
     if (msg.LParam <> 0) then
       begin
         AHook := msg.lParam;
         Caller := msg.wParam;
         ListWnd := GetSysListView32;
       end;
   WM_MOUSEMOVE:
     begin
       if msg.hwnd = ListWnd then
         begin
           id := -1;
           for i := 0 to ListView_GetItemCount(ListWnd)-1 do
             begin
               ListView_GetItemRect(ListWnd, i, ARect, LVIR_BOUNDS);
               if PtInRect(ARect, msg.pt) then
                 begin
                   id := i;
                   Break;
                 end;
             end;
            PostMessage(Caller, WM_USER, 0, id);
         end;
     end;
 end;
 Result := CallNextHookEx(AHook, ncode, wprm, lprm);
end;

var
 hhk: HHOOK;

procedure SetHook(Caller: HWND);
var
  tid: DWord;
  wnd: HWND;
begin
  wnd := GetSysListView32;
  tid := GetWindowThreadProcessId(wnd, nil);

  if hhk <> 0 then
    begin
      UnHookWindowsHookEx(hhk);
      PostThreadMessage(GetCurrentThreadID, 0, 0, 0);
    end;

  if Caller = 0 then
    Exit;

  hhk := SetWindowsHookEx(WH_GETMESSAGE, HookProc, Hinstance, tid);
  if hhk <> 0 then
    PostThreadMessage(tid, WM_NULL, Caller, hhk);
end;

exports
 SetHook;

begin

end.


Т.е., в главной форме делаешь пару кнопок
и наблюдаешь за Application.Title (внизу)


type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure WMUser(var msg: TMessage); message WM_USER;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure SetHook(wnd: HWnd); external "lib3.dll";

procedure TForm1.WMUser;
begin
 Application.Title := IntToStr(msg.LParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SetHook(Handle);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 SetHook(0);
end;


--
С уважением, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.049 c
1-1106062238
menart
2005-01-18 18:30
2005.01.30
Летнее и зимнее время в системе


14-1105282639
DillerXX
2005-01-09 17:57
2005.01.30
У кого есть Rambler телесеть (это по ящику канал вместо культуры)


1-1106216212
New User
2005-01-20 13:16
2005.01.30
Бинарный алгоритм сортировки массива


1-1104865842
SelloutS
2005-01-04 22:10
2005.01.30
как узнать битрейт и время песни которая сейчас играет в винампе


1-1105613951
WhiteGuy
2005-01-13 13:59
2005.01.30
Отлов ошибок