![]() |
另类的砖头 · 国产片真敢拍!土葬和火葬之争,陈佩斯赵丽蓉这 ...· 3 月前 · |
![]() |
可爱的红烧肉 · 食品安全管理制度_校园安全· 1 年前 · |
![]() |
礼貌的蛋挞 · 朱启贵:国民经济核算体系:奠基与变革--全国 ...· 1 年前 · |
![]() |
直爽的棒棒糖 · 如何用250种语言说我爱你- 知乎· 1 年前 · |
![]() |
阳刚的熊猫 · 动画《恋爱要在征服世界后》确定2022年4月 ...· 1 年前 · |
我有一个应用程序,它调用其他实用程序来为特定设备设置一些设置。使用ShellExecuteEx调用该实用程序。
为了避免混淆用户,最好将实用程序应用程序的窗口设置为我的主窗口。一个人是怎么做到的?
我尝试过的事情:
简单的回答是,即使线程处于相同的进程中,也无法无缝地为线程A中的窗口创建线程B模式的窗口。如果您拥有这两个窗口的代码,您可能会接近,但在这种情况下,您将获得更好的结果,通过将您的所有UI放在一个线程。
如果您试图向用户建议线程B的窗口是线程A的模式,那么就有许多微妙的Z顺序和激活行为,您必须纠正(正如您已经注意到的),以免遭受某种不可思议的山谷效应,在用户看来,线程B的窗口显然是试图成为某种东西--它不是这样的,因此看起来是坏的。
为了避免这种情况,我会采取这样的做法:
这样,如果一切正常而迅速地进行,交互很可能是无缝的,但是如果子进程出了问题,或者Z顺序发生了变化等等,就会清楚父进程等待的原因,以及用户需要做什么才能取消或继续他开始的任务。
让我们来看看您的方法#3,它非常接近您想要的。我怀疑问题在于,当辅助应用程序关闭时,Windows决定不希望将焦点恢复到禁用的窗口。在这种情况发生之前,您可以尝试重新启用窗口,但这可能很棘手(而且不值得为此付出努力)。
不要直接禁用窗口,而是尝试通过忽略用户输入来禁用它。因此,与其调用EnableWindow,不如更改消息循环以过滤输入消息。特别是,如果
msg >= WM_KEYFIRST || msg <= WM_KEYLAST || msg >= WM_MOUSEFIRST || msg <= WM_MOUSELAST
然后丢弃该消息;否则,将其传递给常规调度循环。您所做的是创建自己的禁用窗口,但Windows不知道这一点。