栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在python中使用ctypes获取Windows窗口名称

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在python中使用ctypes获取Windows窗口名称

您正在将进程ID传递给带有窗口句柄的函数。您要做的是枚举顶级窗口的句柄,然后将每个窗口映射到一个进程ID。

首先让我们定义ctypes函数原型,以对函数参数进行正确的类型检查。另外,还可用于

use_last_error=True
通过获取最安全的错误处理
ctypes.get_last_error
。许多Windows函数会针对错误返回0,因此
errcheck
在这种情况下只有一个函数很方便
check_zero

from __future__ import print_functionimport ctypesfrom ctypes import wintypesfrom collections import namedtupleuser32 = ctypes.WinDLL('user32', use_last_error=True)def check_zero(result, func, args):        if not result:        err = ctypes.get_last_error()        if err: raise ctypes.WinError(err)    return argsif not hasattr(wintypes, 'LPDWORD'): # PY2    wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD)WindowInfo = namedtuple('WindowInfo', 'pid title')WNDENUMPROC = ctypes.WINFUNCTYPE(    wintypes.BOOL,    wintypes.HWND,    # _In_ hWnd    wintypes.LPARAM,) # _In_ lParamuser32.EnumWindows.errcheck = check_zerouser32.EnumWindows.argtypes = (   WNDENUMPROC,      # _In_ lpEnumFunc   wintypes.LPARAM,) # _In_ lParamuser32.IsWindowVisible.argtypes = (    wintypes.HWND,) # _In_ hWnduser32.GetWindowThreadProcessId.restype = wintypes.DWORDuser32.GetWindowThreadProcessId.argtypes = (  wintypes.HWND,     # _In_      hWnd  wintypes.LPDWORD,) # _Out_opt_ lpdwProcessIduser32.GetWindowTextLengthW.errcheck = check_zerouser32.GetWindowTextLengthW.argtypes = (   wintypes.HWND,) # _In_ hWnduser32.GetWindowTextW.errcheck = check_zerouser32.GetWindowTextW.argtypes = (    wintypes.HWND,   # _In_  hWnd    wintypes.LPWSTR, # _Out_ lpString    ctypes.c_int,)   # _In_  nMaxCount

这是列出可见窗口的功能。它使用一个闭包的回调,

result
而不是使用可选
lParam
参数。后者将需要转换参数。使用闭包比较简单。

def list_windows():    '''Return a sorted list of visible windows.'''    result = []    @WNDENUMPROC    def enum_proc(hWnd, lParam):        if user32.IsWindowVisible(hWnd): pid = wintypes.DWORd() tid = user32.GetWindowThreadProcessId(  hWnd, ctypes.byref(pid)) length = user32.GetWindowTextLengthW(hWnd) + 1 title = ctypes.create_unipre_buffer(length) user32.GetWindowTextW(hWnd, title, length) result.append(WindowInfo(pid.value, title.value))        return True    user32.EnumWindows(enum_proc, 0)    return sorted(result)

为了完整起见,这是一个列出所有进程ID的函数。这包括属于其他Windows会话的进程(例如,会话0中的服务)。

psapi = ctypes.WinDLL('psapi', use_last_error=True)psapi.EnumProcesses.errcheck = check_zeropsapi.EnumProcesses.argtypes = (   wintypes.LPDWORD,  # _Out_ pProcessIds   wintypes.DWORD,    # _In_  cb   wintypes.LPDWORD,) # _Out_ pBytesReturneddef list_pids():    '''Return sorted list of process IDs.'''    length = 4096    PID_SIZE = ctypes.sizeof(wintypes.DWORD)    while True:        pids = (wintypes.DWORD * length)()        cb = ctypes.sizeof(pids)        cbret = wintypes.DWORd()        psapi.EnumProcesses(pids, cb, ctypes.byref(cbret))        if cbret.value < cb: length = cbret.value // PID_SIZE return sorted(pids[:length])        length *= 2

例如:

if __name__ == '__main__':    print('Process IDs:')    print(*list_pids(), sep='n')    print('nWindows:')    print(*list_windows(), sep='n')

MSDN链接:

  • EnumWindows
  • IsWindowVisible
  • GetWindowThreadProcessId
  • GetWindowTextLength
  • GetWindowText
  • EnumProcesses


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646819.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号