在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平台中常用的技术手段之一。
