Loading... # 1、背景 最近一段时间电脑上QQ音乐的桌面歌词窗口怎么都显示不出来了,刚开始怀疑是文件丢失了,但是重装QQ音乐也没用。 # 2、分析 于是怀疑是窗口被移到桌面之外的位置了。首先在一台正常显示的电脑上用 spy++ 找到桌面歌词窗口: ![图片.png](http://47.117.131.13/usr/uploads/2022/03/876774938.png) 回到自己的电脑用 spy++ 查看,同样标题的窗口果然存在。我的屏幕分辨率是 1920*1080,但窗口的坐标大概是 (1150,1320)-(1812,1466) 左右(当时没留下截图),简单说就是在屏幕底部更下面的位置,证实了猜想。 如下 (1104,831)-(1766,977) 就是窗口坐标: ![图片.png](http://47.117.131.13/usr/uploads/2022/03/2784751091.png) # 3、解决方案 想到了两种方案 ## 方案一: 需要额外再接上一块屏幕,打开电脑“个性化”-“显示”-“多显示器设置”。因为我丢失的窗口位于底部更下面的位置,于是在屏幕组合中将第二块显示器拖动到主显示器下面的位置,此时桌面歌词窗口就可见了。 ![图片.png](http://47.117.131.13/usr/uploads/2022/03/3968221996.png) ## 方案二: 微软提供了两个控制鼠标键盘操作的api: * [mouse_event](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event) * [kerbd_event](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-keybd_event) 或同时控制鼠标键盘的: * [SendInput](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput) 使用这些api,我们可以通过代码模拟鼠标键盘的操作。于是使用如下的代码我们就可以将消失的桌面歌词窗口移动到屏幕可视范围内: ```c++ SetCursorPos(2320, 1050); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_MOVE, 0, -500, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); ``` user32!mouse_event 和 user32!keybd_event 底层其实是调用了user32!SendInput,再往里走,通过 user32!NtUserSendInput 进入内核,在内核调用的是 win32k!NtUserSendInput。 在安全圈子,这些 api 的常见使用场景有: * 制作游戏外挂 * 恶意样本模拟键盘鼠标动作,消除弹框或确认恶意动作执行等 * 安全软件hook api,通过检测键盘鼠标动作的模拟执行来检测恶意行为 最后修改:2022 年 03 月 28 日 02 : 17 PM © 允许规范转载