2

win32设置当前窗口——SetForegroundWindow,SetActiveWindow, or ShowWindow?

 2 years ago
source link: https://segmentfault.com/a/1190000040406710
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

win32的函数众多,又比较底层,名字就不太好理解,比如这三个:SetForegroundWindowSetActiveWindow, 和 ShowWindow,到底谁才能把指定窗口变成当前窗口呢?

首先要澄清的就是:

SetActiveWindow 不行

它就不是设计来做这个的——虽然名字里也有Window,但针对的其实是控件,也就是顶级窗口的子窗口(windows里,什么都抽象成窗口了)。它的作用,简单说就是把一个控件设置为可以接收键盘输入。

那么剩下两个呢?

SetForegroundWindow vs ShowWindow

SetForegroundWindow

把一个被盖住的窗口(后台窗口,但没有最小化),放置到最前

ShowWindow

把一个最小化的窗口恢复,并且放置到最前(如果该窗口本来没有最小化,那就不会产生变化)

所以,同时适应两种情况的代码如下:

import win32con
import win32gui

def set_current_window(hwnd):
    if win32gui.IsIconic(hwnd):
        win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
    else:
        win32gui.SetForegroundWindow(hwnd)

注意:判断一个窗口是否最小化的方法,叫做IsIconic,非常奇怪,怎么看怎么像是“是否缩成状态栏图标”,然而它就是“是否最小化”的函数。我猜可能是因为函数库非常“古老”,当时windows还没有状态栏图标呢,任务栏最小化就可以称为Iconic。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK