我编写了一个 VB.NET Windows 窗体应用程序,该应用程序在每次激活事件触发时从进程外 COM 对象请求一个字符串。我的表单有两个选项卡,所以每次我的窗口获得焦点时,我都需要以编程方式切换到正确的选项卡。工作正常,直到...
偶然地,有人运行了一个 vbscript(是的,脚本,不是 exe),其中包含:
Set shell = CreateObject("WScript.Shell")
shell.AppActivate("Window Title That Matches My App")
该脚本始终使我的应用程序崩溃。通常非常糟糕,以至于异常对话框通常无法自行绘制。我必须从任务管理器中杀死它。有时异常是可读的。(我还通过使用 Visual Studio 附加到正在运行的 exe 来确认异常)。它是:“System.Runtime.InteropServices.COMException (0x8001010D):无法进行传出调用,因为应用程序正在调度输入同步调用。”
真正让我心烦的是,我的应用程序使用互斥锁进行多实例检测,如果现有实例正在运行,我自己的代码(编译)使用 VB.NET 自己的 AppActivate 关键字,这不会使我的应用程序崩溃。它按预期激活正在运行的实例并退出冗余实例。
这个问题似乎完全是由 cscript/wscript 的 AppActivate 触发的。我写了一个 3-liner .vbs 来确认这一点。它是可重复的。
有没有办法在我编译的应用程序中捕获或避免这种情况?