C++笔记-获取光标(非鼠标坐标)在屏幕的位置

这里有两种方式获取光标的位置!

本篇博文只能获取有句柄的光标的位置,比如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;
}

 

获取鼠标光标处的坐标可以使用vtkRenderWindowInteractor类的GetEventPosition()方法。该方法返回鼠标事件的屏幕坐标(x, y),然后使用vtkRenderWindow的ScreenToView()方法将屏幕坐标转换为视图坐标。具体实现代码如下: ```c++ // 创建vtkRenderWindow和vtkRenderer vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderWindow->AddRenderer(renderer); // 创建vtkRenderWindowInteractor并设置事件处理程序 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); // 获取鼠标事件的屏幕坐标,并将其转换为视图坐标 void MouseMoveCallback(vtkObject* caller, long unsigned int vtkNotUsed(eventId), void* clientData, void* vtkNotUsed(callData)) { vtkRenderWindowInteractor* interactor = static_cast<vtkRenderWindowInteractor*>(caller); int* screenPos = interactor->GetEventPosition(); double viewPos[3]; vtkRenderWindow* renderWindow = interactor->GetRenderWindow(); vtkRenderer* renderer = renderWindow->GetRenderers()->GetFirstRenderer(); renderer->SetDisplayPoint(screenPos[0], screenPos[1], 0.0); renderer->DisplayToWorld(); renderer->GetWorldPoint(viewPos); } interactor->AddObserver(vtkCommand::MouseMoveEvent, mouseMoveCallback); // 开始交互 interactor->Initialize(); renderWindow->Render(); interactor->Start(); ``` 在上面的代码中,MouseMoveCallback()方法在鼠标移动事件发生时被调用,它首先使用vtkRenderWindowInteractor类的GetEventPosition()方法获取鼠标事件的屏幕坐标(screenPos),然后使用vtkRenderWindow和vtkRenderer将屏幕坐标转换为视图坐标(viewPos)。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值