Sapi不停地向所有(一个)进程窗口发送击键

我正在尝试使用Sapi(in-proc,使用VS2010 Express和C#)将按键发送到自定义的主窗口窗体程序。

问题是,当Sapi识别出一个短语时,它确实发送了适当的密钥,但是它将它们发送到该主程序进程的所有打开的窗口。

这里的问题是我的Sapi程序像其他主程序的插件,所以它“活在”它,所以我通过一个公开的方法发送该主程序的密钥,而不是通常的密钥。 net send.keys,所以我没有select处理窗口句柄。

另一方面,当我有一个确切的方法发送一个表单上的button点击事件内的键,并实际上用鼠标单击button,问题不会发生,键只发送到聚焦的窗口它应该,而不是打开的窗户的其余部分。

我尝试使用“speech_recognized”事件每次有一个识别时,在窗体上的button上调用“perform_click()”,它的工作和发送密钥,但再次..到该进程的所有窗口。

所以我很确定这是关于“谁发出呼叫”,并且这导致我到了被确认的事件中的“对象发送者”:

void engine_SpeechRecognized(object sender,SpeechRecognizedEventArgs e){…}

我想我可能缺乏关于如何将Sapi“已识别”事件从调用发送密钥的对象中分离出来的知识,即使我试图中和它并以多种方式传递我的发送密钥方法的调用,似乎因为它总是知道它最初被Sapi调用,而不是通过表单上的方法或button单击事件来进行相应的处理。

另一件我尝试的例子是将识别的短语赋值为全局string的值,然后在不接受参数的窗体上调用void方法,然后调用发送具有该全局string值的键的方法。

那也是,虽然我不明白如何,知道它来自Sapi并且把钥匙发送到所有打开的窗口。 也许是一个我看不见的,一无所知的参照物? 所以,因为我认为这是“对象发件人”,保持其引用,这就是为什么发生,我已经试图将“发件人”铸造为“窗体”或“button”或“控制”,但它是不可能的对这些,所以我试图使它为null后,我读取它的值,然后将它们发送到主程序的一个焦点窗口但似乎对象保持活着莫名其妙(虽然所有手表显示“空”),并保持将密钥发送到所有打开的窗口。

我试过speechRecognitionEngine.RecognizeAsyncStop(); 在识别之后,它仍然是发送者对象。

我也尝试了speechRecognitionEngine.Dispose(); 获得识别结果后

也试图在识别之后将所有的东西都归零:引擎,“对象发送者”,参数的“e”。 在承认之后的时候,它不会对接下来发生的事情没有任何影响。 但它确实..

我已经试过了几个小时的debugging,我可以想到的一切..请帮助我在这里..我能做些什么来克服这个问题? 帮助非常感谢!

谢谢。 射线。


更新:

@EricBrown非常感谢布朗先生。 我现在明白好多了。 你确定让我在错误的地方挖掘。

实际上,我并不想绕过任何窗口或任何东西,我需要将密钥发送到聚焦的窗口,但是我的程序会将它发送到主程序的所有窗口中,而不pipe它是否聚焦。

相反,正如我所提到的点击我的程序上的一个button,调用完全相同的发送密钥方法,只发送密钥到聚焦的窗口。

问题是主程序没有提供一种方法来通过它的API来为其发送键方法分配一个窗口的句柄,而且我猜想,因为SAPI是在较低的层次上,所以它将它发送到所有的窗口正在进行中。 这是我不明白的。 发送密钥代码是没有问题的,如果我点击button,但如果我调用该代码的方法或由SAPIbutton“perform_click”,它发送到所有窗口,重点或不。

我会提到我已经尝试了一切,包括将焦点设置到活动窗口,然后将密钥发送到它,它只是将其发送到所有窗口。

现在我正试图find一种方法,只发送到主窗口的主API程序,但它看起来是不可能的..如果你有任何想法如何可以这/黑客我想听..

非常感谢..再次感谢!


另一个更新:

public void sendMyKeys(string stringToSend) { MainProgram.FocusMainWindow(); MainProgram.SendKeystrokes(stringToSend); } sendMyKeys("Test");