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

Posted songofhawk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32设置当前窗口——SetForegroundWindow,SetActiveWindow, or ShowWindow?相关的知识,希望对你有一定的参考价值。

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。

以上是关于win32设置当前窗口——SetForegroundWindow,SetActiveWindow, or ShowWindow?的主要内容,如果未能解决你的问题,请参考以下文章

Python win32gui 获取窗口中虚拟光标的当前位置

利用python+win32api获取标题对应的窗口句柄id,并且操作为当前活动窗口

3.win32窗口类

Win32 设置窗口透明度 SetLayerTransparent

Win32 Ime

Visual Basic 出现多个奇怪错误 - 无法设置控件的 Win32 父窗口