最近接到这么个需求,要求获取 windows 下鼠标当前位置的所在应用。代码如下:
int main()
{
POINT point;
Sleep(1000);
GetCursorPos(&point); //获取鼠标当前坐标
HWND h = WindowFromPoint(point); //根据坐标获取所在窗口句柄
printf("handle: %d\n", (int)h);
printf("x=%d, y=%d\n", point.x, point.y);
printf("window text: ");
char s[400] = {0};
boolean res = GetWindowText(h, s, 400); //根据窗口句柄获取窗口标题
for (int i = 0; i < 400; i++) {
printf("%c", s[i]);
}
return 0;
}
如代码中注释,主要就是用到 GetCursorPos()、WindowFromPoint() 和 GetWindowText() 三个方法。编译、执行。当鼠标放在当前 vscode 窗口时:
控制台 window text 一行显示的也是当前应用程序,没问题。当鼠标放到桌面任务栏时:
显示乱码了,这时需要修改项目属性,将字符集改成多字节字符集:
修改后再重新编译执行:
可见编码已正常输出。其实还可以将鼠标放到其他位置查看打印效果如何,此处就不再尝试了。
到此基本就解决了获取鼠标指向当前应用的问题。此外由于前阵子接触了 jna 包,想着在 java 中试试看能否正常调用获取呢?而且 c 程序中还是存在些问题的,如字符数组 s 定义的长度是 400,理论上会造成一定空间的浪费的,如果利用 java 中的动态可变字符串类型,就可以避免这个问题了。
但是在尝试写 java 代码过程中,jna 包中目前并没有 WindowFromPoint() 方法的定义。不过已经有小伙伴恰好在昨天提出来了,详情可点击链接:https://github.com/java-native-access/jna/issues/1463。其实也是可以自己实现添加的哈,此处就不多做操作啦!
以上,欢迎交流~