欢迎访问宙启技术站
智能推送

在Python中使用WPARAM参数处理自定义消息的示例代码

发布时间:2024-01-19 12:03:21

在Python中处理自定义消息时,WPARAM参数通常用于传递一些额外的数据或标志给消息处理函数。下面是一个使用WPARAM参数处理自定义消息的示例代码,以及一个简单的使用例子。

示例代码:

import win32con
import win32api
import win32gui
import ctypes

# 自定义消息常量
MY_MESSAGE = win32con.WM_USER + 100

# 消息处理函数
def wndProc(hwnd, msg, wParam, lParam):
    if msg == MY_MESSAGE:
        # 获取WPARAM参数
        param = ctypes.cast(lParam, ctypes.py_object).value
        print("Received custom message with WPARAM:", param)
    else:
        # 默认消息处理
        return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)

# 注册窗口类
className = "MyWindowClass"
wndClass = win32gui.WNDCLASS()
wndClass.lpfnWndProc = wndProc
wndClass.lpszClassName = className
wndClass.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW
wndClass.hbrBackground = win32gui.GetStockObject(win32con.WHITE_BRUSH)
atom = win32gui.RegisterClass(wndClass)

# 创建窗口
hwnd = win32gui.CreateWindow(
    atom, "My Window", win32con.WS_OVERLAPPEDWINDOW,
    win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 500, 300,
    None, None, None, None
)

# 发送自定义消息
param = "Hello, World!"
lParam = ctypes.py_object(param)
win32api.PostMessage(hwnd, MY_MESSAGE, 0, ctypes.addressof(lParam))
# 注意:必须保证lParam在PostMessage之后仍然可访问,可以使用ctypes.py_object进行包装

# 消息循环
win32gui.PumpMessages()

在这个示例代码中,我们定义了一个自定义消息MY_MESSAGE,并通过PostMessage函数发送该消息。参数param被包装成了ctypes.py_object,并通过ctypes.addressof获取其地址作为lParam传递给PostMessage函数。

消息处理函数wndProc通过判断msg参数是否等于MY_MESSAGE来处理收到的自定义消息。如果是自定义消息,使用ctypes.cast将lParam转换为py_object,再通过.value获取原始的param参数。

使用例子:

import win32gui
import win32con
import win32api

className = "MyWindowClass"

def wndProc(hwnd, msg, wParam, lParam):
    if msg == win32con.WM_DESTROY:
        win32gui.PostQuitMessage(0)
        return 0
    else:
        # 处理自定义消息
        if msg == win32con.WM_USER + 100:
            print("Received custom message with WPARAM:", wParam)
        return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)

wndClass = win32gui.WNDCLASS()
hInstance = win32api.GetModuleHandle(None)
wndClass.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW
wndClass.lpfnWndProc = wndProc
wndClass.hInstance = hInstance
wndClass.lpszClassName = className
win32gui.RegisterClass(wndClass)

hwnd = win32gui.CreateWindow(
    className, "My Window", win32con.WS_OVERLAPPEDWINDOW,
    win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
    500, 300, 0, 0, hInstance, None
)

# 发送自定义消息
param = "Hello, World!"
win32api.PostMessage(hwnd, win32con.WM_USER + 100, 0, param)

win32gui.ShowWindow(hwnd, win32con.SW_SHOWDEFAULT)
win32gui.UpdateWindow(hwnd)

while win32gui.GetMessage(None, 0, 0, 0) != 0:
    win32gui.TranslateMessage(byref(msg))
    win32gui.DispatchMessage(byref(msg))

在这个例子中,我们定义了一个简单的窗口并使用自定义消息机制进行通信。窗口类的注册、窗口的创建和消息处理函数的定义与上例相同。

在消息处理函数中,通过判断msg参数是否为win32con.WM_USER + 100来处理收到的自定义消息。如果是自定义消息,直接打印出wParam。

在主循环中,我们通过win32gui.GetMessage获取消息,并通过win32gui.DispatchMessage将其分发给消息处理函数进行处理。

以上是一个使用WPARAM参数处理自定义消息的示例代码和使用例子。自定义消息机制可以方便地实现进程间通信或线程间通信,是Windows平台中常用的技术手段之一。