【问题标题】:How to hook into WndProc using Python clr WinForms如何使用 Python clr WinForms 连接到 WndProc
【发布时间】:2018-04-14 11:58:12
【问题描述】:

我的最终目标是使用pywebview 拥有一个可调整大小的无边框窗口。我正在使用 Windows 和 WinForms。 我可以通过这样做使其无边界:

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

但是,我希望能够移动它并调整它的大小。要在 C# 中正常执行此操作,我可以覆盖派生 Form 类中的 WndProc 方法并调用调整大小消息。不过,我不确定如何在 Python 中执行此操作。 pywebview中的Form是defined here

我无法将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
    )

但它似乎没有被调用。

【问题讨论】:

    标签: python winforms clr wndproc


    【解决方案1】:

    GetModuleHandle 检索应用程序模块句柄,而不是窗口句柄。 您需要从CreateWindow/GetActiveWindow 或其他返回窗口句柄的函数返回的句柄!

    试试这个:

    ctypes.windll.user32.SetWindowLongW(self.Handle, GWL_WNDPROC, WndProcType(self.MyWndProc))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2015-09-19
      • 2020-08-03
      • 2018-07-17
      • 1970-01-01
      • 2015-11-15
      • 2010-10-04
      相关资源
      最近更新 更多