`
cppmule
  • 浏览: 447410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

wxPython处理Windows消息的一种实现方法

 
阅读更多

wxPython处理Windows消息的一种实现方法

wxWidgets可以很方便的处理Windows消息,只要重载wxWindow类中的MSWWindowProc函数就可以了。而wxPython是没提供这个方法的,需要用pywin32模块调用几个Win32 API才能实现处理Windows消息。虽然麻烦了点,但总比没有解决办法要好。

Sometimes you may need to catch a Windows message that is not already handled by wxWidgets, so there is no wxEvent for it. With a bit of help from the PyWin32 modules it is possible to hook into the WndProc chain for a wxWindow and watch for the message you are interested in.

The magic is in the win32gui.SetWindowLong function. When used with the win32con.GWL_WNDPROC flag it causes a new WndProc to be set for the window, and returns the old one. This lets you write a function in Python that can get first crack at all the Windows messages being sent to the window, and if you are not interested in them then pass them on to the original wxWidgets WndProc.

 

方法一:

import wx   
import win32api   
import win32gui   
import win32con   

class TestFrame(wx.Frame):   
    def __init__(self):   
        wx.Frame.__init__(self, None, title="WndProc Test", size=(200,150))   
        p = wx.Panel(self)   

        # Set the WndProc to our function   
        self.oldWndProc = win32gui.SetWindowLong(self.GetHandle(),   
                                                 win32con.GWL_WNDPROC,   
                                                 self.MyWndProc)   

        # Make a dictionary of message names to be used for printing below   
        self.msgdict = {}   
        for name in dir(win32con):   
            if name.startswith("WM_"):   
                value = getattr(win32con, name)   
                self.msgdict[value] = name   


    def MyWndProc(self, hWnd, msg, wParam, lParam):   
        # Display what we've got.   
        print (self.msgdict.get(msg), msg, wParam, lParam)   

        # Restore the old WndProc. Notice the use of wxin32api   
        # instead of win32gui here. This is to avoid an error due to   
        # not passing a callable object.   
        if msg == win32con.WM_DESTROY:   
            win32api.SetWindowLong(self.GetHandle(),   
                                   win32con.GWL_WNDPROC,   
                                   self.oldWndProc)   

        # Pass all messages (in this case, yours may be different) on   
        # to the original WndProc   
        return win32gui.CallWindowProc(self.oldWndProc,   
                                       hWnd, msg, wParam, lParam)   

app = wx.PySimpleApp()   
f = TestFrame()   
f.Show()   
app.MainLoop() 
import wx
import win32api
import win32gui
import win32con

class TestFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="WndProc Test", size=(200,150))
        p = wx.Panel(self)

        # Set the WndProc to our function
        self.oldWndProc = win32gui.SetWindowLong(self.GetHandle(),
                                                 win32con.GWL_WNDPROC,
                                                 self.MyWndProc)

        # Make a dictionary of message names to be used for printing below
        self.msgdict = {}
        for name in dir(win32con):
            if name.startswith("WM_"):
                value = getattr(win32con, name)
                self.msgdict[value] = name


    def MyWndProc(self, hWnd, msg, wParam, lParam):
        # Display what we've got.
        print (self.msgdict.get(msg), msg, wParam, lParam)

        # Restore the old WndProc. Notice the use of wxin32api
        # instead of win32gui here. This is to avoid an error due to
        # not passing a callable object.
        if msg == win32con.WM_DESTROY:
            win32api.SetWindowLong(self.GetHandle(),
                                   win32con.GWL_WNDPROC,
                                   self.oldWndProc)

        # Pass all messages (in this case, yours may be different) on
        # to the original WndProc
        return win32gui.CallWindowProc(self.oldWndProc,
                                       hWnd, msg, wParam, lParam)

app = wx.PySimpleApp()
f = TestFrame()
f.Show()
app.MainLoop()

 

方法二:

import ctypes   
import wx   

from ctypes import c_long, c_int   

# grab the functions we need - unicode/not doesn't really matter   
# for this demo   
SetWindowLong = ctypes.windll.user32.SetWindowLongW   
CallWindowProc = ctypes.windll.user32.CallWindowProcW   


# a function type for the wndprc so ctypes can wrap it   
WndProcType = ctypes.WINFUNCTYPE(c_int, c_long, c_int, c_int, c_int)   

# constants   
GWL_WNDPROC = -4 

class TestFrame(wx.Frame):   
    def __init__(self, parent):   
        wx.Frame.__init__(self, parent)   
        # need to hold a reference to WINFUNCTYPE wrappers,   
        # so they don't get GCed   
        self.newWndProc = WndProcType(self.MyWndProc)   
        self.oldWndProc = SetWindowLong(   
            self.GetHandle(),   
            GWL_WNDPROC,   
            self.newWndProc   
        )   


    def MyWndProc(self, hWnd, msg, wParam, lParam):   
        print msg,wParam,lParam   
        return CallWindowProc(   
            self.oldWndProc,   
            hWnd,   
            msg,   
            wParam,   
            lParam   
        )   

app =wx.App(False)   
f = TestFrame(None)   
f.Show()   
app.MainLoop()

分享到:
评论

相关推荐

    python用WxPython库实现无边框窗体和透明窗体实现方法详解

    WxPython是一个强大的库,它为Python提供了一种跨平台的方式来创建GUI应用程序。这个库是基于C++实现的wxWidgets库的Python封装,支持多种操作系统,包括Windows、Linux和macOS。 在标题和描述中提到的两个实例,...

    豆瓣电台客户端,使用wxpython实现

    “豆瓣电台客户端,使用wxpython实现”这一标题揭示了我们要讨论的是一个专为Windows操作系统设计的豆瓣电台应用,它基于Python的GUI库wxpython进行开发。wxPython是一个流行的Python库,用于创建跨平台的图形用户...

    wxpython的一些实例

    Python是一种广泛使用的编程语言,因其简洁的语法和强大的功能而备受青睐。在Python中进行图形用户界面(GUI)开发时,WxPython是一个非常重要的库。WxPython是Python的一个绑定库,它允许开发者使用wxWidgets库来...

    wxPython开发参考书籍

    **一、什么是 wxPython** wxPython 是一个 Python 模块,它为 Python 程序员提供了与操作系统用户界面(GUI)进行交互的能力。它是基于跨平台的 wxWidgets 库,使得开发者可以用 Python 来创建原生外观的应用程序,...

    wxpython框架

    wxPython是一种使用Python语言开发GUI应用程序的库,它基于C++的wxWidgets库。wxWidgets库提供了跨平台的支持,可以在Windows、Linux和macOS等多个操作系统上运行。wxPython为Python开发者提供了一种简单、直观的...

    wxPython 中文学习资料

    MVC架构则是一种常见的软件设计模式,有助于保持代码结构清晰,便于维护和扩展。 **8. 实战项目** 在学习过程中,实践是检验理论的最好方式。通过创建实际的GUI应用,如计算器、日历、画板等,可以更好地理解和...

    wxpython examples

    wxPython 是一个强大的图形用户界面(GUI)工具包,它将 Python 语言与 wxWidgets 库结合在一起,为开发者提供了一种在 Python 中创建原生跨平台应用程序的方法。wxWidgets 是一个 C++ 库,实现了许多操作系统原生的...

    Part1 wxPython入门

    - **简介**:wxPython是一种广泛使用的Python库,它允许开发者利用wxWidgets C++库来创建跨平台的图形用户界面(GUI)。wxPython是免费且开源的,支持Windows、Mac OS X和Linux等操作系统。 #### 1.1 开始wxPython ...

    wxpython in action.pdf

    - **概念**:事件驱动编程是一种编程范式,程序的执行流是由外部事件触发的。 - **原理**:当某个事件发生时,会触发相应的回调函数,从而执行特定的操作。 - **实现**:在wxPython中,通过为控件绑定事件处理器来...

    wxpython连接mysql实现的登录验证的 实例(二)

    接着,MySQL是一种广泛应用的关系型数据库管理系统(RDBMS),用于存储和管理数据。在Python中,我们可以使用像`pymysql`或`mysql-connector-python`这样的库来与MySQL进行交互,执行SQL查询并处理结果。 在这个...

    wxPython.API参考手册chm

    CHM文件是一种Windows下的帮助文件格式,通常包含索引、搜索功能和组织良好的内容,便于快速查找和学习。 **核心概念** 1. **类**: wxPython是面向对象的,因此它的基本构建块是类。这些类代表了各种GUI元素,如...

    wxPython实战(中文版).pdf

    wxPython提供了一种事件驱动的编程模型。事件是用户与界面交互时发生的动作,比如点击按钮、移动鼠标或输入文本。你可以为这些事件编写处理函数,从而实现特定的功能。例如,你可以定义一个按钮点击事件的处理器,当...

    python3+wxpython图书馆管理系统

    Python3和wxPython结合开发的图书馆管理系统是一种基于GUI(图形用户界面)的应用程序,它使得图书管理人员能够方便地管理图书信息,包括添加新图书、删除图书、修改图书详情以及进行图书借阅和归还等操作。...

    wxPython开发指南

    它从ABC和Haskell语言中汲取灵感,是一种高级、通用且跨平台的解释型语言。 Python提供了几种GUI选项,包括PyGTK、wxPython和PyQt,其中wxPython因其性能、灵活性和丰富的组件库而备受推崇。wxPython的核心由五个...

    wxPython实战(中英文)

    1. **对话框**:wxPython提供了一系列内置的对话框,如消息对话框、打开/保存文件对话框、颜色和字体选择对话框等,方便开发者快速集成到应用中。 2. **文件选择**:wxPython的FileDialog类允许用户选择文件或目录...

    wxPython-4.0.1.tar.gz

    GUI(Graphical User Interface)是人与计算机交互的一种方式,它通过图标、窗口、菜单等可视化元素来简化用户操作。在Python中,有许多GUI库可供选择,如Tkinter、PyQt、Kivy等,而wxPython是其中之一,它提供了...

    wxPython_in_action中文版(chm)及其源码

    wxWidgets库提供了跨平台的支持,使得开发者可以用一种语言编写程序,然后在多个操作系统上运行,包括Windows、Linux和macOS。wxPython允许程序员使用Python的简洁语法和强大的功能来构建美观、功能丰富的应用程序。...

    wxPython实战(中文版)

    - **定义**: wxPython是一种用于Python的GUI工具包,基于跨平台的C++库wxWidgets构建。 - **目标**: 使开发者能够创建功能丰富且美观的应用程序,这些应用程序可以在多种操作系统上运行,包括Windows、macOS和Linux...

    wxPython-demo-2.6.0.0.tar.gz

    【wxPython】是一种基于Python语言的图形用户界面(GUI)工具包,它允许开发者使用Python编写具有丰富图形界面的应用程序。wxPython是wxWidgets库的Python绑定,wxWidgets本身是跨平台的C++库,支持多种操作系统,如...

Global site tag (gtag.js) - Google Analytics