0

我编写了一个 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 来确认这一点。它是可重复的。

有没有办法在我编译的应用程序中捕获或避免这种情况?

4

1 回答 1

0

我不清楚为什么这种方法实际上可以解决问题,但它确实有效:

  1. 在表单中添加一个计时器。
  2. 将所有 _Activated 代码移动到计时器的 _Tick 事件中。
  3. 使 _Activated 事件启动计时器。
  4. 使 _Tick 事件停止计时器,然后执行 COM 内容。
于 2013-06-24T13:39:50.013 回答