【问题标题】:Programmatically find blink cursor position in windows c++?以编程方式在 Windows C++ 中查找闪烁光标位置?
【发布时间】:2012-01-09 15:53:30
【问题描述】:

如何从 C++ 中找出 Windows 中闪烁光标的位置?在很多情况下,我需要发送按钮单击闪烁光标的位置,但我没有找到任何重要的功能可以解决这个问题。

操作系统 win 7(64), c++

【问题讨论】:

  • 这对我来说毫无意义。按钮点击发生在按钮上,不依赖于位置。此外,按钮没有插入符号(这是闪烁光标的名称)。对您的问题的直接回答是,当您的进程保持焦点时,您只需调用GetFocus,如果它在另一个进程中,则调用GetGUIThreadInfo。如果你能解释你的基本目标是什么,那可能会更好。是什么激发了这个问题?
  • 当我测试多个代码时,我经常将这些文本代码放在 notepad++ 中,并且几乎不使用自动热键我发送到 notepad++ 快捷方式以选择所有文本并将这些文本复制到 Visual Studio 项目。 .cpp 文件。之后,自动密钥编译并运行这些代码。所以我发送了两个命令,一个是全选,第二个是复制。因此,如果您选择所有文本,则插入符号将成为文本顶部的问题。 positionig caret 的要点是,如果您在选择之前保存位置很容易走远,则无需自己找到上次停止的位置。

标签: windows winapi console cursor-position


【解决方案1】:

它被称为“插入符号”,光标是鼠标指针。您使用 GetCaretPos() 来获取它的位置。但是返回的位置是相对于拥有插入符号的窗口的客户区而言的。这可能意味着您需要首先找到该窗口,为此使用 GetForegroundWindow() 。并且不要发送按钮点击消息,它们是发布的,所以使用 PostMessage()。

只需使用 SendInput() 即可避免所有这些。

请注意,UIPI(UAC 的用户界面组件)会阻止您将内容插入提升进程所拥有的窗口中。

【讨论】:

  • 由于某种原因,在使用 GetForegroundWindow 和 GetCaretPos 时,x 和 y 值总是为 0,您有什么建议吗?
  • IIRC,GetCaretPos() 获取调用线程的插入符号位置(没有 HWND 或类似参数);我认为您不能使用它从另一个线程或应用程序获取插入符号位置;在这种情况下可以使用 GetGUIThreadInfo。
【解决方案2】:

GetGUIThreadInfo() 可能是你最好的选择;使用 idThread = 0 传递它以从当前活动线程中获取信息,然后检查返回的 GUITHREADINFO 结构的 rcCaret 成员。然后,您需要使用带有 hwndCaret 值的 ClientToScreen() 将客户端相对坐标转换为屏幕坐标。

请注意,这只适用于使用 Win32 插入符函数的应用程序 - 特别是 SetCaretPos()。如果一个应用程序在不使用它们的情况下绘制了自己的插入符号,您可能不会得到任何有意义的回报。 (某些应用程序,如 Word,绘制自己的插入符号,但仍调用 SetCaretPos,以便需要跟踪插入符号的辅助功能可以使用此技术。)

返回的矩形有时可能比实际插入符号宽。当位图用于插入符号时,就像从右到左或从左到右插入符号的情况一样,顶部附有一个小“标志”,你会得到一个比它宽一点的矩形实际插入符号区域,并且可能需要调整或以其他方式确定实际插入符号栏在该区域内的位置 - 它可能在也可能不在正中间。不过,看起来 Notepad++ 应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多