日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python ctypes模块调用API函数, 制作控制电脑其他窗口工具

發布時間:2023/12/14 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python ctypes模块调用API函数, 制作控制电脑其他窗口工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時, 需要使用程序自動控制某個窗口, 或者是系統默認的窗口樣式太單調, 想換一個樣式。
為此, 作者使用tkinter編寫了窗口控制工具, 而控制窗口又需要調用API函數。
先展示效果圖:

目錄

    • 導入ctypes模塊
    • 調用API函數
        • 獲取窗口句柄
        • 獲取/設置窗口標題
        • 最小化/取消最小化
        • 關閉窗口
        • 更改窗體樣式
    • 常見問題
    • 總結

導入ctypes模塊

ctypes 是 Python 的外部函數庫。它提供了與 C 兼容的數據類型,并允許調用 DLL 或共享庫中的函數。導入ctypes模塊, 使用如下代碼即可:

from ctypes import *

調用API函數

使用ctypes的windll對象可實現調用API函數的功能。

獲取窗口句柄

句柄(Handle, 簡稱hwnd)是一個是用來標識對象或者項目的標識符,可以用來描述窗體、文件等。獲取句柄后可實現窗口的控制。

winname = input('輸入窗口標題') hwnd = windll.user32.FindWindowW(c_char_p(None),winname) print(hwnd)

獲取/設置窗口標題

需要使用GetWindowTextW, SetWindowTextW函數。set函數接收2個參數, 分別為句柄和一個字符串。

title=input('輸入新標題') windll.user32.SetWindowTextW(hwnd, title)

get函數還需要一個字符串緩沖區, 使用create_string_buffer創建。

p = create_string_buffer(256) windll.user32.GetWindowTextW(hwnd,byref(p),256) # 獲取窗口標題 title = str(p.raw,encoding='utf-16').strip('\x00') # 解碼

最小化/取消最小化

使用了CloseWindow, OpenIcon API函數; 函數接收1個參數, 為hwnd。

# 最小化 windll.user32.CloseWindow(hwnd) # 注意, 不是關閉窗口 # 取消最小化 windll.user32.OpenIcon(hwnd)

關閉窗口

調用SendMessageA函數, 向窗口發送關閉消息即可。

WM_CLOSE = 0x10 windll.user32.SendMessageA(hwnd,WM_CLOSE,0,0)

更改窗體樣式

窗體樣式分為兩類, 分別是GWL_STYLE和GWL_EXSTYLE 。

  • 獲取樣式
  • GWL_STYLE = -16 GWL_EXSTYLE = -20 old1=windll.user32.GetWindowLongA(hwnd,GWL_STYLE), old2=windll.user32.GetWindowLongA(hwnd,GWL_EXSTYLE)
  • 設置樣式
    使用GWL_STYLE和GWL_EXSTYLE可實現多種效果。
    注意: 使用GWL_STYLE時須在第三個參數中加入WS_VISIBLE,使窗口可用。
  • # 常量 WS_BORDER = 0x800000 WS_CAPTION = 0xC00000 # WS_BORDER Or WS_DLGFRAME WS_CHILD = 0x40000000 WS_CLIPCHILDREN = 0x2000000 WS_CLIPSIBLINGS = 0x4000000 WS_POPUP = 0x80000000 WS_DLGFRAME = 0x400000 WS_DISABLED = 0x8000000 WS_OVERLAPPEDWINDOW = 0xcf0000 WS_THICKFRAME = 0x40000 WS_VISIBLE = 0x10000000WS_EX_APPWINDOW = 0x40000 WS_EX_DLGMODALFRAME = 0x1 WS_EX_ACCEPTFILES = 0x10 WS_EX_CLIENTEDGE= 0x200 WS_EX_TOOLWINDOW = 0x80 WS_EX_WINDOWEDGE = 0x100# 正常 windll.user32.SetWindowLongA(hwnd, GWL_STYLE, old1) windll.user32.SetWindowLongA(hwnd, GWL_EXSTYLE, old2) #無邊框 windll.user32.SetWindowLongA(hwnd,GWL_STYLE,WS_VISIBLE+WS_CLIPSIBLINGS+WS_CLIPCHILDREN) #細邊框 windll.user32.SetWindowLongA(hwnd,GWL_STYLE,WS_VISIBLE+WS_CLIPSIBLINGS+WS_CLIPCHILDREN + WS_THICKFRAME)) #邊框加粗 windll.user32.SetWindowLongA(hwnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE)) # 工具窗口 windll.user32.SetWindowLongA(hwnd,GWL_EXSTYLE, WS_EX_TOOLWINDOW))

    常見問題

  • 調用API函數, 如GetWindowTextW時, 需要使用create_string_buffer()創建一個字符串緩沖區對象。
  • 調用API遇到類型錯誤時, 可修改函數的argtypes或restype屬性,如:
  • from ctypes import * windll.user32.GetWindowLongA.argtypes = [c_long,c_long] windll.user32.GetWindowLongA.restype = c_long windll.user32.GetWindowLongA(hwnd,GWL_STYLE)

    另外, 有時需用到函數byref(), 以傳遞對象的引用。
    3. 調用API時可能遇到編碼問題, 需要將數據轉換成Windows系統默認使用的ANSI編碼。

    總結

    使用ctypes庫的windll對象可實現調用各種API函數的功能。
    完整源代碼見這里: 鏈接。

    總結

    以上是生活随笔為你收集整理的Python ctypes模块调用API函数, 制作控制电脑其他窗口工具的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。