用户在输入过程中,光标的位置在不停变化,如何得到这个位置来进行一些操作呢?似乎很简单,GetCaretPos,这个函数能得到光标的位置。
看看MSDN上如何说的:
GetCaretPos
See Also
SetCaretPos | POINT | Carets Functions
Requirements
OS Versions: Windows CE 1.0 and later.
Header: Winuser.h.
Link Library: Caret.lib.
This function copies the caret's position, in client coordinates, to the specified POINT structure.
BOOL GetCaretPos(
LPPOINT lpPoint
);
Parameters
lpPoint
[out] Long pointer to the POINT structure that is to receive the client coordinates of the caret.
Return Values
Nonzero indicates success. Zero indicates failure. To get extended error information, call GetLastError.
Remarks
The caret position is always given in the client coordinates of the window that contains the caret.
If an application calls GetCaretPos from a thread that does not own the caret, GetCaretPos fails with an error value of ERROR_ACCESS_DENIED.
很遗憾,实际的结果,此函数对于本进程是有效的,对于别的进程缺无能为力,真的会得到错误值ERROR_ACCESS_DENIED。
看看windows上有什么好方法吧。
网上找找,通用的大概有两种方法:1)使用AttachThreadInput将本进程注入到输入焦点窗口进程(当然要先找到焦点窗口),这样就能使用GetCaretPos了;2)使用GetGUIThreadInfo可以获得位置信息。
还是很遗憾,wince对于这两个函数都不支持。
在绝望地摸索了一段时间后,通过曲线救国的方式,事情似乎有了转机。
微软提供了两个函数GetWindowLong和SetWindowLong,这个函数可以得到和设置指定窗口的一些信息,包括窗口进程的地址。
先准备一些料,包饺子用的,后面会用到:
static WNDPROC g_pOldWndProc = NULL;
static WNDPROC g_pOldEditProc = NULL;
static UINT g_uGetFocusMessage = RegisterWindowMessage(_T("GetFocusMessage"));
static UINT g_uGetCaretMessage = RegisterWindowMessage(_T("GetCaretMessage"));
static UINT g_uGetRectMessage = RegisterWindowMessage(_T("GetRectMessage"));
static POINT g_ptCaret;
static RECT g_rcEdit;
static LRESULT WINAPI GetFocusWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == g_uGetFocusMessage)
{
return (LRESULT)GetFocus();
}
else
{
return CallWindowProc(g_pOldWndProc, hWnd, uMsg, wParam, lParam);
}
}
static LRESULT WINAPI GetCaretPosWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == g_uGetCaretMessage)
{
return (LRESULT)GetCaretPos(&g_ptCaret);
}
else if(uMsg == g_uGetRectMessage)
{
return (LRESULT)GetWindowRect(hWnd, &g_rcEdit);
}
else
{
return CallWindowProc(g_pOldEditProc, hWnd, uMsg, wParam, lParam);
}
}
现在假设一上层窗口,拥有输入Edit,我们用下面的方法可以得到输入光标的坐标:
HWND hWnd = GetForegroundWindow();
if(hWnd)
{
g_pOldWndProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC);
//设置一个新的窗口进程
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)GetFocusWindowProc);
HWND hEdit = (HWND)SendMessage(hWnd, g_uGetFocusMessage, 0, 0);
if(hEdit)
{
g_pOldEditProc = (WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC);
SetWindowLong(hEdit, GWL_WNDPROC, (LONG)GetCaretPosWindowProc);
SendMessage(hEdit, g_uGetRectMessage, 0, 0);
BOOL b = (BOOL)SendMessage(hEdit, g_uGetCaretMessage, 0, 0);
if(b)
{
//此处利用g_rcEdit和g_ptCaret就可以得到光标相对于屏幕的位置
}
SetWindowLong(hEdit, GWL_WNDPROC, (LONG)g_pOldEditProc);
g_pOldEditProc = NULL;
}
//用完了,要恢复
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)g_pOldWndProc);
g_pOldWndProc = NULL;
}
分享到:
相关推荐
在Windows Mobile上获取天气信息,我们需要构建一个能够连接到互联网并访问特定天气网站的客户端程序。 1. **网络编程**:使用Windows Mobile,我们可以借助.NET Compact Framework中的System.Net命名空间来实现...
本篇文章将深入探讨如何在Windows Mobile平台上通过编程方式获取硬件IMEI。 首先,我们需要了解IMEI的组成。IMEI通常由15位数字组成,分为两部分:TAC(Type Allocation Code)和S/N(Serial Number)。TAC是制造商...
Windows Mobile 6.0 模拟器使用 Windows Mobile 6.0 模拟器是一个功能强大的工具,可以模拟企业邮件收发,主要用于测试和开发目的。在本文中,我们将详细介绍如何设置 Windows Mobile 6.0 模拟器来收发企业电子邮件...
Windows Mobile 5.0 仿真器是一款用于开发者和测试人员的工具,它允许用户在桌面计算机上模拟运行 Windows Mobile 5.0 操作系统的设备。这个仿真器对于开发、调试和测试移动应用至关重要,因为它提供了在真实设备上...
同时,定期检查更新以获取最新的功能和安全性改进,是保证Windows Mobile设备中心顺畅运行的关键。 总结来说,Windows Mobile设备中心(64位)是Windows 7 64位用户管理Windows Mobile手机的必备工具,它提供全面的...
在Windows Mobile 6.5操作系统中,用户可以找到一系列实用的软件来提升设备的使用体验。这个压缩包包含了几个常见的应用程序,旨在帮助用户更高效地管理和利用他们的Windows Mobile设备。 首先,"任务管理1.exe"和...
在Windows Mobile平台上,服务程序是操作系统的核心组成部分,它们在系统启动时自动运行,提供后台支持,无需用户直接交互。服务程序在Windows Mobile上的工作原理和桌面版Windows有所不同,但核心概念相似,即通过...
《Windows Mobile平台上的My Mobile软件详解》 在移动操作系统的历史中,Windows Mobile曾是一个重要的角色,为许多智能手机提供了操作系统支持。在这个系统上,有一款名为"My Mobile"的应用软件,它为用户提供了...
尽管现在Windows Mobile已被新的操作系统如Windows Phone和Android取代,但Windows Mobile 6.5在当时的影响力不容忽视,它为移动设备的操作系统设定了标准,并且在iPAQ 114这样的设备上展现了其强大的生命力。
Windows Mobile UI 设计主要关注的是在智能手机和Pocket PC平台上使用.NET框架进行用户界面的构建。Windows Mobile操作系统是基于Windows CE内核的,它为内存有限和资源受限的移动设备提供了定制化的开发环境。与...
在Windows Mobile 6平台上开发QR条形码应用是一项常见的任务,尤其对于那些希望在移动设备上集成快速数据传输功能的开发者来说。QR(Quick Response)条形码是一种二维条形码,它能存储比传统一维条形码更多且更复杂...
本文将详细讲解如何在Windows Mobile平台上获取这种唯一标识。 首先,我们需要理解“唯一标识”在Windows Mobile中的意义。这个标识应该能够区分不同的设备,即使重置或恢复出厂设置后,该标识仍然保持不变。早期的...
在本文中,我们将深入探讨如何在Windows Mobile 6.0平台上使用WebService技术实现与个人计算机(PC)服务器的通信。Windows Mobile 6.0是微软为掌上设备开发的一个操作系统,它提供了丰富的功能和API,使得移动设备...
众所周知,在windows7操作系统中已经不需要安装active sync ...清您下载windows mobile center for windows7(vista也是如此)软件,然后将手机与电脑连接即可.亲自操作,该方法适合于任何版本的windows mobile 手机系统.
《深入探索Windows Mobile经典源码》 Windows Mobile是一款由微软公司开发的移动操作系统,它曾经在智能手机领域占据重要地位,为开发者提供了丰富的平台来构建移动应用程序。本资料集中的"WindowsMobile5 金典源码...
### Windows Mobile开发实验知识点 #### 实验一:使用ActiveSync连接Smartphone与PC机 **实验目的** 通过本次实验,学习如何使用ActiveSync在Smartphone与PC之间建立连接。 **预备知识** - 了解Windows Mobile...
《Windows Mobile直连版:大华客户端在移动设备上的应用详解》 Windows Mobile直连版本是专为搭载Windows Mobile操作系统的手机设计的一款监控客户端软件,它使得用户能够在移动设备上实时查看、控制以及管理监控...