프로그램의 WM_COPYDATA API를 통해 상호 작용하지만 PumpMessage 기능에 붙어있는 스크립트를 작성하고 있습니다. 내 코드에서PumpMessages를 지나치 지 않아
import win32con, win32api, win32gui
import ctypes, ctypes.wintypes
FindWindow = ctypes.windll.user32.FindWindowW
SendMessage = ctypes.windll.user32.SendMessageW
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_char_p)
#formally lpData is c_void_p, but we do it this way for convenience
]
PCOPYDATASTRUCT = ctypes.POINTER(COPYDATASTRUCT)
class Stickies:
def __init__(self):
message_map = {
win32con.WM_COPYDATA: self.OnCopyData
}
wc = win32gui.WNDCLASS()
wc.lpfnWndProc = message_map
wc.lpszClassName = 'MyWindowClass'
hinst = wc.hInstance = win32api.GetModuleHandle(None)
classAtom = win32gui.RegisterClass(wc)
self.hwnd = win32gui.CreateWindow (
classAtom,
"win32gui test",
0,
0,
0,
win32con.CW_USEDEFAULT,
win32con.CW_USEDEFAULT,
0,
0,
hinst,
None
)
self.send_message("api do register")
def __enter__(self):
return self
def __exit__(self):
self.send_message("api do deregister")
def send_message(self, msg):
hwnd = FindWindow(None, "ZhornSoftwareStickiesMain")
cds = COPYDATASTRUCT()
cds.dwData = 0
str = msg.encode("ascii")
cds.cbData = ctypes.sizeof(ctypes.create_string_buffer(str))
cds.lpData = ctypes.c_char_p(str)
SendMessage(hwnd, win32con.WM_COPYDATA, self.hwnd, ctypes.byref(cds))
def OnCopyData(self, hwnd, msg, wparam, lparam):
pCDS = ctypes.cast(lparam, PCOPYDATASTRUCT)
msg = pCDS.contents.lpData.decode("ascii", "ignore")
if msg != None:
print(msg)
return 1
s = Stickies()
win32gui.PumpMessages()
# Never gets past previous line
print("Hello, world!")
, 나는 성공적으로 메시지를주고받을 수 있지만 나는 내 스크립트는 다른 일을 할 수 있도록하는 방법에 관해서는 확실하지 않다 할 수 있습니다. 내 목표는 이것을 기본 클래스로 사용하고 다른 스크립트에 통합하는 것입니다.
- 가 pumpmessage() 함수
- 과거를 얻을 클래스의 외부에서 메시지를 처리 :
나는 방법을 모르겠어요.
모든 도움을 주시면 감사하겠습니다.
PumpMessages는 표준 Windows 메시지 루프를 구현합니다. 메시지를 반복하고 처리합니다. 스레드가 WM_QUIT 메시지를 수신 할 때까지 (일반적으로 GUI가 응용 프로그램에서 메인 윈도우가 닫혀있을 때까지) 리턴하지 않을 것입니다. – arx
@arx : 메시지를 기다리는 더 좋은 방법이 있습니까? 불행히도 저는 파이썬에서 이런 종류의 것들에 대한 많은 정보/예제를 실제로 찾지 못했습니다. – Jacobm001