我正在尝试使用Sapi(使用VS2010 Express和C#)将按键发送到自定义主窗体窗体程序。
问题在于,当Sapi识别出一个短语时,它会发送相应的密钥,但它会将它们发送到该主程序进程的所有打开窗口。
这里的问题是我的Sapi程序就像是其他主程序的插件,所以它的生活和#34;在其中,所以我通过一个公开的方法发送密钥,用于发送该主程序的密钥,并且通过.net send.keys发送 not ,所以我没有选择交易带窗口把手。
另一方面,当我有一个相同的方法来发送表单上的按钮点击事件中的键,并实际上用鼠标单击按钮,问题不会发生,键只发送到了应有的焦点窗口,而不是其他打开的窗口。
我尝试使用" speech_recognized"调用" perform_click()"的事件每次有识别时,在表单上的那个按钮上,它确实有效并发送密钥,但是再次...到该进程的所有窗口。
所以我很确定这是关于"谁打电话"这导致我进入"对象发送者"那是在公认的事件中:
void engine_SpeechRecognized(object sender,SpeechRecognizedEventArgs e){...}
我想我可能缺乏关于如何分离Sapi"认可"即使我试图中和它并以多种方式传递对我的发送键方法的调用,它仍然是调用键发送的对象的事件,它似乎总是知道它最初是由Sapi调用而不是由窗体上的方法或按钮单击事件,并相应地表现。
我尝试的另一件事就是将识别的短语分配给全局字符串的值,然后在不接受任何参数的表单上调用void方法,并调用方法来发送值为全局字符串。
同样,虽然我不明白怎么做,知道它来自Sapi并将钥匙发送到所有打开的窗户。也许是一个我无法看到和知之甚少的参考资料? 因为我认为它是"对象发送者"这是保持其参考,这就是它发生的原因,我已经尝试过铸造"发送者" as" Form"或"按钮"或"控制"但是不可能将这个对象强制转换为这些,所以我尝试将它从它读取之后将其设置为null,然后将它们发送到主程序的一个聚焦窗口但是看起来这个对象仍然存在(虽然所有手表都显示" Null")并且不断将钥匙发送到所有打开的窗户。
我已经尝试过speechRecognitionEngine.RecognizeAsyncStop();在识别之后,它仍然是发件人对象。
我也尝试过speechRecognitionEngine.Dispose();在获得认可的结果后立即。
并且在识别之后还尝试使所有内容都为空:引擎,"对象发送者"," e"的论点。 在承认之后,它并不认为对接下来发生的事情没有影响。 但它确实......
我已经尝试了几个小时的调试时间。 请帮帮我.. 我该怎么做才能克服这个问题? 非常感谢帮助!
谢谢。 射线。
更新
@EricBrown非常感谢布朗先生。我现在明白了。 你确定让我在错误的地方挖掘..
实际上我并没有试图绕过任何窗户或任何东西, 我做需要将密钥发送到焦点窗口,但我的程序将其发送到该主程序进程的所有窗口,无论是否关注。
正如我提到的那样点击我的程序上的一个按钮,该按钮调用完全相同的发送键方法,该方法仅将键发送到聚焦窗口。
问题是主程序没有通过其API提供一种方法来为其发送密钥方法分配窗口的句柄,而且,我想因为SAPI处于较低级别,然后它发送它在这个过程中的所有窗口。这就是我不明白的。如果我单击按钮但是如果我使用该代码调用方法或者" perform_click"那么发送密钥代码就可以了。在SAPI的那个按钮上,它将它发送到所有窗口,无论是否关注。
我会提到我已尝试过所有内容,包括在将密钥发送到活动窗口之前将焦点设置到活动窗口,它只是将其发送到所有窗口。
现在我正在尝试找到一种方法,只能通过主程序API将它发送到聚焦窗口,但它看起来不可能..如果你有任何想法,如何制作/黑客攻击我很想听听......
非常感谢..再次感谢!
另一次更新:
public void sendMyKeys(string stringToSend)
{
MainProgram.FocusMainWindow();
MainProgram.SendKeystrokes(stringToSend);
}
sendMyKeys("Test");