2011-09-26 156 views
1

一个给定的外部(未由当前进程所拥有的)窗口(hWnd)首先最小化,那么隐藏的:ShowWindowAsync不激活一个隐藏+最小化窗口?

ShowWindowAsync(hWnd, SW_MINIMIZE); 
// wait loop inserted here 
ShowWindowAsync(hWnd, SW_HIDE); 

以下调用正确它恢复到未最小化(恢复)状态:

ShowWindow(hWnd, SW_RESTORE); 

然而,这个电话没有:

ShowWindowAsync(hWnd, SW_RESTORE); 

在第二种情况下与ShowWindowAsync()中,窗口未被最小化并且不再隐藏,但未被激活(保留在其他现有窗口之后)。相反,第一个ShowWindow()调用会正确激活该窗口。

这是预期的行为? 如何在不依赖ShowWindow()(同步(阻塞))的情况下恢复窗口(到前台)?(该示例中的等待循环可具有超时,而ShowWindow()不允许超时的规范。)

(操作系统SP3)

+0

呼叫的ShowWindow()+ SetForegroundWindow()。 –

+0

@HansPassant:这是一个阻塞(同步)调用,我试图避免。 – Unsigned

回答

1

这里的溶液作为用于:

ShowWindowAsync(hWnd, SW_SHOW); 
// wait loop inserted here 
ShowWindowAsync(hWnd, SW_RESTORE); 

这基本上用来隐藏窗口的片段的反转:

ShowWindowAsync(hWnd, SW_MINIMIZE); 
// wait loop inserted here 
ShowWindowAsync(hWnd, SW_HIDE); 
1

ShowWindowAsync职位显示窗口事件给定的消息队列窗口。特别是,窗口显示的是它的线程,而不是你的线程。不同之处在于你的线程是前台线程,因此可以激活另一个窗口,而这个窗口本身不能执行。