I'm trying to change a Window procedure using Win32 API and ctypes. My code is based to a previous answer that used pywin32 package, with the goal of removing this dependency.
My code raises the following error when I resize the window:
Exception ignored on calling ctypes callback function: <function main.<locals>.new_window_proc at 0x0000028442162170>
Traceback (most recent call last):
File "test.py", line 40, in new_window_proc
return user32.CallWindowProcA(old_window_proc, hwnd, msg, wparam, lparam)
ctypes.ArgumentError: argument 5: <class 'OverflowError'>: int too long to convert
Resulting in this :
Here is the code :
import pygame
import ctypes
from ctypes import wintypes
user32 = ctypes.windll.user32
WNDPROC = ctypes.WINFUNCTYPE(
ctypes.c_long,
wintypes.HWND,
ctypes.c_uint,
wintypes.WPARAM,
wintypes.LPARAM)
WM_SIZE = 0x0005
RDW_INVALIDATE = 0x0001
RDW_ERASE = 0x0004
GWL_WNDPROC = -4
def main():
pygame.init()
screen = pygame.display.set_mode((320, 240), pygame.RESIZABLE | pygame.DOUBLEBUF)
def draw_game():
screen.fill(pygame.Color('black'))
pygame.draw.rect(screen, pygame.Color('red'), pygame.Rect(0,0,screen.get_width(),screen.get_height()).inflate(-10, -10))
pygame.display.flip()
old_window_proc = user32.GetWindowLongPtrA(
user32.GetForegroundWindow(),
GWL_WNDPROC
)
def new_window_proc(hwnd, msg, wparam, lparam):
if msg == WM_SIZE:
draw_game()
user32.RedrawWindow(hwnd, None, None, RDW_INVALIDATE | RDW_ERASE)
return user32.CallWindowProcA(old_window_proc, hwnd, msg, wparam, lparam)
new_window_proc_cb = WNDPROC(new_window_proc)
user32.SetWindowLongPtrA(
user32.GetForegroundWindow(),
GWL_WNDPROC,
ctypes.cast(new_window_proc_cb, ctypes.POINTER(ctypes.c_long))
)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
elif event.type == pygame.VIDEORESIZE:
pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE| pygame.DOUBLEBUF)
draw_game()
if __name__ == '__main__':
main()
I tried chaning wintypes.WPARAM
and wintypes.LPARAM
to ctypes.c_ulonglong
or ctypes.c_longlong
, without success.