Python ctypes模块调用API函数, 制作控制电脑其他窗口工具
有時, 需要使用程序自動控制某個窗口, 或者是系統(tǒng)默認的窗口樣式太單調(diào), 想換一個樣式。
為此, 作者使用tkinter編寫了窗口控制工具, 而控制窗口又需要調(diào)用API函數(shù)。
先展示效果圖:
目錄
- 導入ctypes模塊
- 調(diào)用API函數(shù)
- 獲取窗口句柄
- 獲取/設(shè)置窗口標題
- 最小化/取消最小化
- 關(guān)閉窗口
- 更改窗體樣式
- 常見問題
- 總結(jié)
導入ctypes模塊
ctypes 是 Python 的外部函數(shù)庫。它提供了與 C 兼容的數(shù)據(jù)類型,并允許調(diào)用 DLL 或共享庫中的函數(shù)。導入ctypes模塊, 使用如下代碼即可:
from ctypes import *調(diào)用API函數(shù)
使用ctypes的windll對象可實現(xiàn)調(diào)用API函數(shù)的功能。
獲取窗口句柄
句柄(Handle, 簡稱hwnd)是一個是用來標識對象或者項目的標識符,可以用來描述窗體、文件等。獲取句柄后可實現(xiàn)窗口的控制。
winname = input('輸入窗口標題') hwnd = windll.user32.FindWindowW(c_char_p(None),winname) print(hwnd)獲取/設(shè)置窗口標題
需要使用GetWindowTextW, SetWindowTextW函數(shù)。set函數(shù)接收2個參數(shù), 分別為句柄和一個字符串。
title=input('輸入新標題') windll.user32.SetWindowTextW(hwnd, title)get函數(shù)還需要一個字符串緩沖區(qū), 使用create_string_buffer創(chuàng)建。
p = create_string_buffer(256) windll.user32.GetWindowTextW(hwnd,byref(p),256) # 獲取窗口標題 title = str(p.raw,encoding='utf-16').strip('\x00') # 解碼最小化/取消最小化
使用了CloseWindow, OpenIcon API函數(shù); 函數(shù)接收1個參數(shù), 為hwnd。
# 最小化 windll.user32.CloseWindow(hwnd) # 注意, 不是關(guān)閉窗口 # 取消最小化 windll.user32.OpenIcon(hwnd)關(guān)閉窗口
調(diào)用SendMessageA函數(shù), 向窗口發(fā)送關(guān)閉消息即可。
WM_CLOSE = 0x10 windll.user32.SendMessageA(hwnd,WM_CLOSE,0,0)更改窗體樣式
窗體樣式分為兩類, 分別是GWL_STYLE和GWL_EXSTYLE 。
使用GWL_STYLE和GWL_EXSTYLE可實現(xiàn)多種效果。
注意: 使用GWL_STYLE時須在第三個參數(shù)中加入WS_VISIBLE,使窗口可用。
常見問題
另外, 有時需用到函數(shù)byref(), 以傳遞對象的引用。
3. 調(diào)用API時可能遇到編碼問題, 需要將數(shù)據(jù)轉(zhuǎn)換成Windows系統(tǒng)默認使用的ANSI編碼。
總結(jié)
使用ctypes庫的windll對象可實現(xiàn)調(diào)用各種API函數(shù)的功能。
完整源代碼見這里: 鏈接。
總結(jié)
以上是生活随笔為你收集整理的Python ctypes模块调用API函数, 制作控制电脑其他窗口工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用友oracle安装教程,用友NC安装在
- 下一篇: 数字图像处理课后习题汇总