![]() |
玩足球的核桃 · 习惯的力量(新版)-查尔斯·都希格-微信读书· 11 月前 · |
![]() |
大鼻子的海龟 · 英语系-上海大学外国语学院· 1 年前 · |
![]() |
微笑的白开水 · 秀恩爱翻车?李荣浩求婚视频首曝光,杨丞琳第三 ...· 1 年前 · |
![]() |
飞奔的机器猫 · 2022年第二次双一流评选会有什么变化? - 知乎· 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不知道这一点。
![]() |
玩足球的核桃 · 习惯的力量(新版)-查尔斯·都希格-微信读书 11 月前 |
![]() |
大鼻子的海龟 · 英语系-上海大学外国语学院 1 年前 |
![]() |
飞奔的机器猫 · 2022年第二次双一流评选会有什么变化? - 知乎 1 年前 |