读书人

如何模拟点击托盘图标

发布时间: 2012-02-12 17:16:34 作者: rapoo

怎么模拟点击托盘图标
怎么模拟点击(或者其他方法)托盘图标
单击右键如下图

然后点击消费查询。。


[解决办法]

Delphi(Pascal) code
  function RightClickProcessTray(const ProcessID: THandle): Boolean;  var    h: THandle;    p: PTBBUTTON;    i: Integer;    b: _TBBUTTON;    hTray: Cardinal;    dw: Cardinal;    TrayPid: Cardinal;    TempPid: Cardinal;    IcoHwnd: Cardinal;    r: TRect;    point: TPoint;  begin    Result := False;    hTray := FindWindow('Shell_TrayWnd', nil);    hTray := FindWindowEx(hTray, 0, 'TrayNotifyWnd', nil);    hTray := FindWindowEx(hTray, 0, 'SysPager', nil);    hTray := FindWindowEx(hTray, 0, 'ToolbarWindow32', nil);    GetWindowThreadProcessId(hTray, TrayPid);    h := OpenProcess(PROCESS_ALL_ACCESS, False, TrayPid);    p := VirtualAllocEx(h, nil, SizeOf(b) + SizeOf(r), MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);    for i := 0 to SendMessage(hTray, TB_BUTTONCOUNT, 0, 0) - 1 do    begin      ZeroMemory(@b, SizeOf(b));      WriteProcessMemory(h, p, @b, SizeOf(b), dw);      SendMessage(hTray, TB_GETBUTTON, i, LPARAM(p));      ReadProcessMemory(h, p, @b, SizeOf(b), dw);      ReadProcessMemory(h, Pointer(b.dwData), @IcoHwnd, 4, dw);//返回到本地的结构中dwData成员表示托盘图标句柄所在的位置      GetWindowThreadProcessId(IcoHwnd, TempPid);      if TempPid = ProcessID then      begin        SendMessage(hTray, TB_GETITEMRECT, i, LPARAM(LPARAM(p) + SizeOf(b)));        ReadProcessMemory(h, Pointer(LPARAM(p) + SizeOf(b)), @r, SizeOf(r), dw);        Windows.ClientToScreen(hTray, point);        point.X := point.X + r.Left;        point.Y := point.Y + r.Top;        SetCursorPos(point.X, point.Y);//菜单弹出位置        {按下右键弹出菜单,不能松开右键,否则可能弹出系统任务栏菜单}        Result := (0 = SendMessage(hTray, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(r.Left, r.Top)));        Break;      end;    end;    VirtualFreeEx(h, p, 0, MEM_RELEASE);    CloseHandle(h);  end;
[解决办法]
2L 代码有问题,我测试的任务管理器是可以的,但其他程序好像不行,其他程序鼠标右键好像要弹起。


Result := (0 = SendMessage(hTray, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(r.Left, r.Top)));
下面加一行
Result := (0 = SendMessage(hTray, WM_RBUTTONUP, 0, MAKELPARAM(r.Left, r.Top)));

读书人网 >.NET

热点推荐