Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 缓冲区按钮更改表单_C#_Click_Mouse_Buffer_Wfp - Fatal编程技术网

C# 缓冲区按钮更改表单

C# 缓冲区按钮更改表单,c#,click,mouse,buffer,wfp,C#,Click,Mouse,Buffer,Wfp,这是我的第一篇文章。我有一个让我头疼的大问题。我有一个应用程序使用WinForms,一个TTS文本到语音的语音和自定义按钮的状态 在我的第一个表单main中,当我单击按钮时,应用程序会在第一个表单上方打开第二个表单。好啊 当我通过按钮关闭第二个表单时,我告诉TTS说了什么,表单自动关闭,再次查看第一个表单。嗯 当我在第二个表单上的按钮上单击两次时,问题就开始了:TTS显示了一些信息,按钮关闭,“第二次单击”仍在单击缓冲区或某个地方,它在第一个表单中单击,当我第一次单击按钮时,4秒后出现。 我在同

这是我的第一篇文章。我有一个让我头疼的大问题。我有一个应用程序使用WinForms,一个TTS文本到语音的语音和自定义按钮的状态

在我的第一个表单main中,当我单击按钮时,应用程序会在第一个表单上方打开第二个表单。好啊 当我通过按钮关闭第二个表单时,我告诉TTS说了什么,表单自动关闭,再次查看第一个表单。嗯

当我在第二个表单上的按钮上单击两次时,问题就开始了:TTS显示了一些信息,按钮关闭,“第二次单击”仍在单击缓冲区或某个地方,它在第一个表单中单击,当我第一次单击按钮时,4秒后出现。 我在同步模式下使用语音;如果我在异步模式下使用语音,应用程序将以一个很好的异常结束。 如果我在第二个表单中单击三次或四次,其他的单击仍然保留在缓冲区中,并且始终在第一个表单中单击

我尝试1删除双击事件,2删除与按钮关联的事件,3隐藏从第二个表单返回时自动单击的按钮,4在创建第二个表单之前隐藏第一个表单,并在完成后恢复

建议? 谢谢

对不起,我的英文是:S


PD2:发生的情况。

使用布尔标志跟踪表单是否处于接受单击的状态

IE-当您打开第二个表单时,'boolean canPlaySound=true;'当按钮单击事件激发时,仅在canPlaySound为true时播放声音,并在播放声音之前将其设置为false

下一次单击将被忽略,因为canPlaySound=false。您将无法播放声音。

编辑2

看过代码后,我理解了您现在遇到的问题。按钮点击堆积的原因是当您在TTS中调用Speak时,应用程序在等待函数完成时锁定。这段时间内的任何按下按钮都会堆积起来,直到应用程序可以再次处理它们,然后在处理消息之前立即关闭表单,然后在第一个表单中处理这些消息

我提出了一些对您有用的解决方案:

在TTS类中只使用SpeakAsync命令,并引入一个等待系统,在该系统中,您可以在执行任何操作之前等待语音完成。这将释放应用程序,不会导致鼠标单击事件堆积

触发Speak命令后,可以访问Windows消息列表并清除进程完成前发生的所有鼠标单击事件。不幸的是,我不确定您将如何实现这一点,因为我以前没有这样做过。我认为您需要覆盖WndProc函数,但我也不确定。这也可能有点危险,因为您可能会错误地清除完全有效或重要的系统消息。很抱歉,我无法在这方面提供更多帮助

在第二个窗体中实现一个后台工作程序,它将在后台线程上分别处理Speak命令。这将再次释放应用程序,使鼠标单击事件不会叠加。我已经修改了您的示例项目,并将其压缩以供您查看。如果你愿意,我可以进一步解释,但基本上是这样的:

表单2加载并创建后台工作程序。 Worker_DoWork和Worker_WorkComplete委托是在后台Worker中创建和设置的。这些函数在工作程序启动时和工作程序完成后调用。 表单2触发后台工作程序启动。然后,后台工作者坐在一个无限循环中,等待命令处理。 当按下Hello按钮时,这会将SayHello布尔值设置为true,工作人员会发现这一点,执行相应的speak函数,然后重置布尔值以备下次按下。 当按下Close按钮时,在后台工作程序中调用CancelASync请求。 CancelASync中断BackgroundWorker的主循环CancellationPending变为true。在中断BackgroundWorker的主循环之前,将发送相应的speak命令,并将DoWorkEventArgs的cancel属性设置为true。 中断主循环会导致调用Worker_WorkComplete,然后关闭表单。 我希望你能遵循下面链接的例子,我在这里已经解释得很好了。我更喜欢这个解决方案,因为它非常可扩展,例如,您可以在主工作线程中添加更多条件

就像我说的,如果你有任何问题,请问我,我会尽力帮助你

希望这有帮助


示例链接:

不起作用。不仅仅是这个按钮,点击仍保留在缓冲区中,可以点击第二种形式的任何地方。如果隐藏第一张表格不起作用,我不知道该怎么办。哦,我明白了,对不起,我误读了这个问题。我现在编辑我的答案,看看新的解决方案是否对你有帮助。我已经在@zaba进行了编辑,我希望我已经了解了你的问题
我现在给你一个可行的解决方案。如果你遇到更多的困难,请告诉我,我在事件中无法使用e.Handled方法。它是正确的写?添加了一个链接与一个小例子项目。