心软的夕阳 · 健身气功·马王堆导引术中医理论诠释· 4 周前 · |
孤独的钢笔 · 东北旅游热门城市将迎来客流高峰-中国科技网· 3 月前 · |
爱玩的小笼包 · 广东58所学校上榜!· 6 月前 · |
爱吹牛的枇杷 · 大连的旅顺口为什么不让日本人进入_头条· 1 年前 · |
强健的柿子 · https://zs.xmu.edu.cn/ ...· 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不知道这一点。
心软的夕阳 · 健身气功·马王堆导引术中医理论诠释 4 周前 |
孤独的钢笔 · 东北旅游热门城市将迎来客流高峰-中国科技网 3 月前 |
爱玩的小笼包 · 广东58所学校上榜! 6 月前 |
爱吹牛的枇杷 · 大连的旅顺口为什么不让日本人进入_头条 1 年前 |