![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно отлавить наведение мыши на иконку на раб. столе?
Ната © (2004-12-09 10:53:00)Пожалуйста, не могли бы Вы мне подсказать как программно отлавить событие наведение мыши на иконку на раб. столе?
Leonid Troyanovsky (2004-12-10 14:33:00) [1]
> Ната (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.
grom (2004-12-10 13:37:00) [2]Если на своей иконке то можно так:
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;
Ната (2004-12-10 09:43:00) [3]не обязательно своей, на любой
grom (2004-12-09 19:20:00) [4]программно отлавить наведение мыши на иконке своей программы?
Leonid Troyanovsky (2004-12-09 14:29:00) [5]
> Ната (09.12.04 13:59) [3]
> а нет ли более простых путей?
Можно без сабклассирования.
Попробуй SetWindowsHookEx WH_GETMESSAGE (в dll),
устанавливаемый на поток Explorer (где SysListView32).
На тот же WM_MOSEMOVE.
--
С уважением, LVT.
Ната (2004-12-09 13:59:00) [6]а нет ли более простых путей?
Leonid Troyanovsky (2004-12-09 12:30:00) [7]
> Ната (09.12.04 10:53)
> Пожалуйста, не могли бы Вы мне подсказать как программно
> отлавить событие наведение мыши на иконку на раб. столе?
Как сабклассировать чужое окно см тред:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1102135227&n=5
Нужное окно - это 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 11:55:00) [8]ну хотя бы киньте ссылку где об этом точно можно найти..