调用SendInput()会导致意外行为

时间:2014-07-31 13:49:55

标签: c++ winapi

调用SendInput来模拟按下左键单击似乎是在执行下面写入SendInput的调用后执行的代码后执行的。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

WM_CONTEXTMENU处理程序中,只需将LB_SETCURSEL消息(对于单选ListBox)或LB_SETSEL消息(对于多选ListBox)直接发送到ListBox&# 39; s HWND选择所需的列表项,然后显示弹出菜单。