【问题标题】:Calling SendInput() results in unexpected behaviour调用 SendInput() 会导致意外行为
【发布时间】:2014-07-31 13:49:54
【问题描述】:

调用SendInput 来模拟按下左键似乎是在执行下面编写的对SendInput 的调用的代码之后执行的。

我创建了一个列表框,我想右键单击以从列表框中选择项目,因此我决定在打开上下文菜单之前立即发送消息 WM_CONTEXTMENU 调用 SendInput 以模拟左键单击,但我相信上下文菜单在左键单击之前弹出,导致左键单击上下文菜单的边缘(什么都不做)。

在调用 SendInput 和创建弹出菜单之间添加MessageBox(0,0,0,0); 会导致成功发生左键单击并选择一个项目,这是我期望和期望的行为。奇怪的是,在调用 SendInput 之后调用 Sleep(1000) 会延迟程序,但不会导致 SendInput 的行为符合预期。

编辑:是的,我知道我的问题的一个解决方案是使用 LB_SETSEL 来选择它,但我这样做部分是为了学习目的,如果我使用 SendInput 遇到类似问题,我想知道如何解决它,所以请帮我解决这个特定的错误。

【问题讨论】:

  • 我建议不要花太多时间调试这个问题,因为这确实是一个X-Y situation。模拟鼠标单击不是从上下文菜单中选择项目的合理方式。为什么不能只通过 ListBox 的常规编程 API 选择项目?
  • MessageBox 泵送消息,Sleep 不会。了解您的问题需要对 Windows 消息队列有很好的了解。但正如 Cody 所说,您肯定是以错误的方式做这件事,而最好的解决方法就是为您的问题找到正确的解决方案,无论它到底是什么。
  • 如果你想了解你的程序为什么会这样,你需要了解消息队列。你了解排队吗?
  • 我想没有达到我应该的程度,有什么推荐的阅读材料吗?

标签: c++ winapi


【解决方案1】:

SendInput() 只是将击键注入键盘的输入缓冲区,然后立即退出,让您的应用程序执行其他操作,而 Windows 在后台处理击键,就像用户手动键入它们一样。这不是您问题的解决方案。

在您的WM_CONTEXTMENU 处理程序中,只需将LB_SETCURSEL 消息(对于单选列表框)或LB_SETSEL 消息(对于多选列表框)直接发送到列表框的 HWND 以选择所需的列表项(s) 在显示弹出菜单之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多