mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2025-04-14 00:07:14 +03:00
protocol: Properly prototype GetMessageW & comment about 'exception'
* In trying to fix the return type 'exception' I first decided to properly prototype GetMessageW(). * But it turns out that you just can't get rid of that exception, so I just added a comment about it being harmless, because the functionality works as intended anyway.
This commit is contained in:
parent
7620bcdaaa
commit
08d28c6f3d
25
protocol.py
25
protocol.py
@ -125,8 +125,8 @@ elif (config.auth_force_edmc_protocol
|
||||
from ctypes import windll # type: ignore
|
||||
from ctypes import POINTER, WINFUNCTYPE, Structure, byref, c_long, c_void_p, create_unicode_buffer, wstring_at
|
||||
from ctypes.wintypes import (
|
||||
ATOM, BOOL, DWORD, HBRUSH, HGLOBAL, HICON, HINSTANCE, HMENU, HWND, INT, LPARAM, LPCWSTR, LPVOID, LPWSTR, MSG,
|
||||
UINT, WPARAM
|
||||
ATOM, BOOL, DWORD, HBRUSH, HGLOBAL, HICON, HINSTANCE, HMENU, HWND, INT, LPARAM, LPCWSTR, LPMSG, LPVOID, LPWSTR,
|
||||
MSG, UINT, WPARAM
|
||||
)
|
||||
|
||||
class WNDCLASS(Structure):
|
||||
@ -161,13 +161,21 @@ elif (config.auth_force_edmc_protocol
|
||||
# Ref: <https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-defwindowprocw>
|
||||
# LRESULT DefWindowProcW([in] HWND hWnd,[in] UINT Msg,[in] WPARAM wParam,[in] LPARAM lParam);
|
||||
# As per example at <https://docs.python.org/3/library/ctypes.html#ctypes.WINFUNCTYPE>
|
||||
|
||||
prototype = WINFUNCTYPE(c_long, HWND, UINT, WPARAM, LPARAM)
|
||||
paramflags = (1, "hWnd"), (1, "Msg"), (1, "wParam"), (1, "lParam")
|
||||
DefWindowProcW = prototype(("DefWindowProcW", windll.user32), paramflags)
|
||||
|
||||
GetParent = windll.user32.GetParent
|
||||
SetForegroundWindow = windll.user32.SetForegroundWindow
|
||||
|
||||
GetMessageW = windll.user32.GetMessageW
|
||||
# <https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessagew>
|
||||
# NB: Despite 'BOOL' return type, it *can* be >0, 0 or -1, so is actually
|
||||
# c_long
|
||||
prototype = WINFUNCTYPE(c_long, LPMSG, HWND, UINT, UINT)
|
||||
paramflags = (1, "lpMsg"), (1, "hWnd"), (1, "wMsgFilterMin"), (1, "wMsgFilterMax")
|
||||
GetMessageW = prototype(("GetMessageW", windll.user32), paramflags)
|
||||
|
||||
TranslateMessage = windll.user32.TranslateMessage
|
||||
DispatchMessageW = windll.user32.DispatchMessageW
|
||||
PostThreadMessageW = windll.user32.PostThreadMessageW
|
||||
@ -309,6 +317,17 @@ elif (config.auth_force_edmc_protocol
|
||||
|
||||
msg = MSG()
|
||||
# Calls GetMessageW: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessagew
|
||||
# Something is off with the return from this, meaning you'll see:
|
||||
# Exception ignored on converting result of ctypes callback function: <function WndProc
|
||||
# at 0x000001F5B8738FE0>
|
||||
# Traceback (most recent call last):
|
||||
# File "C:\Users\Athan\Documents\Devel\EDMarketConnector\protocol.py", line 323, in worker
|
||||
# while int(GetMessageW(byref(msg), None, 0, 0)) != 0:
|
||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
# TypeError: 'c_long' object cannot be interpreted as an integer
|
||||
#
|
||||
# But it does actually work. Either getting a non-0 value and
|
||||
# entering the loop, or getting 0 and exiting it.
|
||||
while GetMessageW(byref(msg), None, 0, 0) != 0:
|
||||
logger.trace_if('frontier-auth.windows', f'DDE message of type: {msg.message}')
|
||||
if msg.message == WM_DDE_EXECUTE:
|
||||
|
Loading…
x
Reference in New Issue
Block a user