我是否可以从 Delphi 应用程序的记事本窗口中找出打字坐标(相对于桌面坐标)?例如,如果我们看下图,我在记事本窗口上打字。我可以找出我在记事本上打字的屏幕坐标吗?
编辑 如果有人可以提出通用解决方案,那将很有帮助。答案 no1 是关于记事本的。控制台窗口怎么样?如果我在控制台窗口上打字,是否可以计算出坐标?
我想,如果 UAC 不会禁用它,您可以实现以下序列:
你必须学习记事本的windows结构。使用WinSpy++
,WinSight
或ProcFS for Total Commander
其他工具。然后您必须获得HWND
实际编辑框窗口的句柄 ( )。枚举或查找其他应用程序窗口的主题已经在 StackOverflow 和 Google 上讨论过很多次。
然后你必须向主编辑窗口询问它的坐标。查看Get{Client/Window}Rect
函数,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms633503.aspx和http://msdn.microsoft.com/en-us/library/windows/desktop/ms633519。 aspx也许更好的是SendMessage
自EM_GETRECT
定义消息:http: //msdn.microsoft.com/en-us/library/ms997530.aspx
然后你必须知道插入符号的位置:like TMemo.SelEnd
and TEdit.SelStart
- 最好的方法就是阅读它们是如何在 VCL 中实现的。可能这将植根于SendMessage(EM_GETSEL,...)
- http://msdn.microsoft.com/en-us/library/ms997530.aspx - 有一个现成的例子可以做到这一点
然后您必须向寡妇询问该位置的相对坐标 - 相对于您在上述步骤中获得的客户端矩形。请参阅EM_POSFROMCHAR
消息http://msdn.microsoft.com/en-us/library/windows/desktop/bb761631.aspx和 Delphi 示例http://www.delphipages.com/forum/showthread.php?t=33707
然而,有些人声称这并不总是可靠地工作:http: //vbcity.com/forums/t/14951.aspx所以作为最后的手段,您可以使用核心字符串解析,如本答案的版本 1 中所述。