我有一个应用程序,它调用其他实用程序来为特定设备设置一些设置。使用ShellExecuteEx调用该实用程序。
为了避免混淆用户,最好将实用程序应用程序的窗口设置为我的主窗口。一个人是怎么做到的?
我尝试过的事情:
发布于 2009-03-10 20:42:01
你有两件事要模拟:所有权和情态。
要模拟所有权:您需要将新子进程窗口的所有者设置为您的窗口。这将缓解任何z排序问题。虽然我不知道这是否从另一个过程起作用。如果没有,那么您可能必须附加线程输入队列,然后调用它。或者使用其他代码注入技术。
SetWindowLong <target window handle>, GWL_HWNDPARENT, <new owner handle>为了模拟模态,我认为您在正确的轨道上使用EnableWindow和WaitForSingleObjectEx。
发布于 2009-03-10 01:23:12
简单的回答是,即使线程处于相同的进程中,也无法无缝地为线程A中的窗口创建线程B模式的窗口。如果您拥有这两个窗口的代码,您可能会接近,但在这种情况下,您将获得更好的结果,通过将您的所有UI放在一个线程。
如果您试图向用户建议线程B的窗口是线程A的模式,那么就有许多微妙的Z顺序和激活行为,您必须纠正(正如您已经注意到的),以免遭受某种不可思议的山谷效应,在用户看来,线程B的窗口显然是试图成为某种东西--它不是这样的,因此看起来是坏的。
为了避免这种情况,我会采取这样的做法:
这样,如果一切正常而迅速地进行,交互很可能是无缝的,但是如果子进程出了问题,或者Z顺序发生了变化等等,就会清楚父进程等待的原因,以及用户需要做什么才能取消或继续他开始的任务。
发布于 2009-03-11 14:09:22
EnableWindow是正确的,这通常是消息框和其他“模式”窗口所做的事情。对于zorder更改,您可以拦截WM_WINDOWPOSCHANGING消息并设置SWP_NOZORDER标志以防止zorder更改。请确保只在设置EnableWindow(false)时才执行此操作。
https://stackoverflow.com/questions/613513
复制相似问题