-
-
[原创]关于托盘图标的模拟点击 SendMessage
-
发表于:
2020-3-5 06:31
5147
-
[原创]关于托盘图标的模拟点击 SendMessage
枚举托盘图标的方法网上有很多了,简单介绍流程
FindWindowEx : Shell_TrayWnd->TrayNotifyWnd->SysPager->ToolbarWindow32 得到[托盘窗口]句柄
GetWindowThreadProcessId(
托盘窗口 ,PID) 得到桌面进程,然后申请一块内存[内存地址]用于保存SendMessage TB_GETBUTTON 返回的结构[
TBBUTTON
]
typedef struct _TBBUTTON {
int iBitmap;
int idCommand;
BYTE fsState;
BYTE fsStyle;
#if ...
BYTE bReserved[6];
#else
BYTE bReserved[2];
#endif
DWORD_PTR dwData; //一般为 TRAYDATA 结构
INT_PTR iString;//图标标题
} TBBUTTON, *PTBBUTTON, *LPTBBUTTON;
struct TRAYDATA
{
HWND hwnd;
UINT uID;
UINT uCallbackMessage;
DWORD Reserved[2];
HICON hIcon;
};
SendMessage (托盘窗口,TB_BUTTONCOUNT ,0,0) 得到图标数量
SendMessage (托盘窗口, TB_GETBUTTON ,图标索引, 内存地址(TBBUTTON) ) 得到图标相关的信息,用于判断是否是我想要的图标,
到这里很简单,网上一堆,但是自己又不想移动鼠标去点击,想着用
SendMessage 实现
首先要获取图标的坐标,
从这里得到了自己想要的数据,https://docs.microsoft.com/en-us/windows/win32/controls/tb-getbutton
找到 TB_GETITEMRECT,发现可以获取到图标的坐标,
SendMessage (托盘窗口, TB_GETITEMRECT ,图标索引,内存地址(RECT) ) 得到坐标
尝试, 直接发送
SendMessage
(
托盘窗口
, WM_LBUTTONDOWN / WM_LBUTTONUP, 1/0, MAKELPARAM (x, y)) 发现图标有反应,但是没响应单击事件
慢慢翻,找到了这个 TB_SETHOTITEM,然后配合鼠标单击消息
SendMessage (托盘窗口, TB_SETHOTITEM ,图标索引,0 )
SendMessage(托盘窗口, WM_LBUTTONDOWN / WM_LBUTTONUP, 1/0, MAKELPARAM (x, y))
成功激活单击事件.
关键点就在于
TB_SETHOTITEM 先设置指定图标为激活状态.
有人说不灵,重新测试了下,发现只有QQ有反应,其他的没反应.
测试的时候用的QQ托盘测试[em_85]
TB_SETHOTITEM 没达到想要的效果.
右键消息是可以发送成功的,而且不用TB_SETHOTITEM
有空在弄!
[课程]Android-CTF解题方法汇总!
最后于 2020-3-5 10:03
被游乐娃子编辑
,原因: BUG提交.