这里有两种方式获取光标的位置!
本篇博文只能获取有句柄的光标的位置,比如LineEdit,记事本等。
像VS编辑框,IE里面的输入框,目前是找不到句柄的,获取不到光标
程序运行截图如下:
这里要介绍几个API
GetFocus():获取当前聚焦的句柄;
GetForegroundWindow():获取当前应用程序的窗口句柄,可以说是聚焦句柄的外部;
AttachThreadInput():将一个线程的输入处理机制附加或分离到另一个线程的输入处理机制;
GetCaretPos():获取插入标记的位置;
ClientToScreen():将位置转为屏幕坐标;
getGUIThreadInfo():功能检索有关的活动窗口或指定的图形用户界面(GUI)线程的信息。
源码如下:
#include<iostream>
#include<windows.h>
#include<winuser.h>
using namespace std;
int main()
{
while(true) {
POINT point;
HWND hwnd = ::GetFocus();
HWND pHwnd = ::GetForegroundWindow();
if (AttachThreadInput(GetCurrentThreadId(), GetWindowThreadProcessId(pHwnd, NULL), TRUE)) {
if (GetCaretPos(&point)) {
ClientToScreen(hwnd, &point);
cout << "WAY 1 : " << "HWND:" << hwnd << " " << "x:" << point.x << " y:" << point.y << endl;
}
}
Sleep(1000);
GUITHREADINFO pg;
POINT point2;
pg.cbSize = 48;
GetGUIThreadInfo(GetWindowThreadProcessId(pHwnd, NULL), &pg);//GetGUIThreadInfo功能检索有关的活动窗口或指定的图形用户界面(GUI)线程的信息。
hwnd = pg.hwndCaret;//显示插入符的窗口句柄
if (pg.hwndCaret)
{
point2.x = pg.rcCaret.right;//rcCaret:一个RECT结构,描写插入符的界限矩形,在客户区坐标,相对hwndCaret成员指定的窗口
point2.y = pg.rcCaret.bottom;
::ClientToScreen(pg.hwndCaret, &point2);//转换成相对于屏幕的坐标
cout << "WAY 2: " << point2.x << " " << point2.y << endl;
}
}
return 0;
}