Как подключиться к WndProc с помощью Python clr WinForms

Моя конечная цель — создать окно без полей с изменяемым размером, используя pywebview. Я использую Windows и WinForms. Я могу сделать это без полей, сделав это:

webview.winforms.BrowserView.instance.browser.FormBorderStyle = 0

Тем не менее, я хотел бы иметь возможность перемещать его и изменять его размер. Чтобы сделать это обычным образом в C#, я могу переопределить метод WndProc в производном классе Form и вызывать сообщения об изменении размера. Я не уверен, как это сделать в Python. Форма в pywebview определена здесь.

Я не могу установить self.WndProc в соответствии со своим определением; Я получаю AttributeError : attribute is read-only. Я попытался подключиться непосредственно к нему следующим образом (в определении формы):

WndProcType = ctypes.WINFUNCTYPE(c_int, c_long, c_int, c_int, c_int)
GWL_WNDPROC = -4
handle = windll.kernel32.GetModuleHandleW(None)
self.oldWndProc = self.WndProc
ctypes.windll.user32.SetWindowLongW(handle, GWL_WNDPROC, WndProcType(self.MyWndProc))
def MyWndProc(self, hWnd, msg, wParam, lParam):
    print ("is it working?")
    return CallWindowProc(
        self.oldWndProc,
        hWnd,
        msg,
        wParam,
        lParam
    )

Но вроде не звонят.


person lifeformed    schedule 02.11.2017    source источник


Ответы (1)


GetModuleHandle извлекает дескриптор модуля приложения, а не дескриптор окна. Вам нужен дескриптор, возвращаемый из CreateWindow/GetActiveWindow или другой функции, которая возвращает дескриптор окна!

Попробуй это:

ctypes.windll.user32.SetWindowLongW(self.Handle, GWL_WNDPROC, WndProcType(self.MyWndProc))
person Daimos    schedule 20.07.2018