限制关闭python应用程序(win32gui)

Posted

技术标签:

【中文标题】限制关闭python应用程序(win32gui)【英文标题】:restrict close python application (win32gui) 【发布时间】:2017-03-10 04:28:34 【问题描述】:

我想限制任何用户关闭应用程序。 我该怎么做?禁用“关闭”按钮或使其成为“最小化”按钮?

此程序将监视特定文件的复制粘贴,因此它必须在系统上连续运行。

import wx
import win32api
import win32gui
import win32con
import win32clipboard
import filelocationvariable

class TestFrame (wx.Frame):
    def __init__ (self):
        wx.Frame.__init__ (self, None, title="Clipboard viewer", size=(0,0))

        self.first   = True
        self.nextWnd = None

        # Get native window handle of this wxWidget Frame.
        self.hwnd    = self.GetHandle ()

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

        try:
            self.nextWnd = win32clipboard.SetClipboardViewer (self.hwnd)
        except win32api.error:
            if win32api.GetLastError () == 0:
                # information that there is no other window in chain
                pass
            else:
                raise


    def MyWndProc (self, hWnd, msg, wParam, lParam):
        if msg == win32con.WM_CHANGECBCHAIN:
            self.OnChangeCBChain (msg, wParam, lParam)
        elif msg == win32con.WM_DRAWCLIPBOARD:
            self.OnDrawClipboard (msg, wParam, lParam)

        # Restore the old WndProc. Notice the use of win32api
        # instead of win32gui here. This is to avoid an error due to
        # not passing a callable object.
        if msg == win32con.WM_DESTROY:
            if self.nextWnd:
               win32clipboard.ChangeClipboardChain (self.hwnd, self.nextWnd)
            else:
               win32clipboard.ChangeClipboardChain (self.hwnd, 0)

            win32api.SetWindowLong (self.hwnd,
                                    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)

    def OnChangeCBChain (self, msg, wParam, lParam):
        if self.nextWnd == wParam:
           # repair the chain
           self.nextWnd = lParam
        if self.nextWnd:
           # pass the message to the next window in chain
           win32api.SendMessage (self.nextWnd, msg, wParam, lParam)

    def OnDrawClipboard (self, msg, wParam, lParam):
        if self.first:
           self.first = False
        else:
            if win32clipboard.IsClipboardFormatAvailable(win32con.CF_TEXT):
                try:
                    win32clipboard.OpenClipboard()
                    data = win32clipboard.GetClipboardData()
                    win32clipboard.CloseClipboard()
                    self.comparing(data)
                except TypeError:
                    pass

            if win32clipboard.IsClipboardFormatAvailable(win32con.CF_HDROP):
                try:
                    win32clipboard.OpenClipboard()
                    text = win32clipboard.GetClipboardData(win32con.CF_HDROP)
                    win32clipboard.CloseClipboard()
                    self.comparing(text[0])
                except TypeError:
                    pass

        if self.nextWnd:
           # pass the message to the next window in chain
            win32api.SendMessage (self.nextWnd, msg, wParam, lParam)

    def comparing(self,text):
        try:
            fp = open(filelocationvariable.implocationlist,'r')
            str2 = text
            for lines in fp:
                str1 = lines[0:len(lines)-1]
                if str1 == str2:
                    try:
                        win32clipboard.OpenClipboard()
                        win32clipboard.EmptyClipboard()
                        win32clipboard.CloseClipboard()

                    except:
                        pass                    


        except IOError:
            pass

        finally:
            fp.close()


app   = wx.App(False)
frame = TestFrame ()
frame.Show ()
app.MainLoop ()

【问题讨论】:

【参考方案1】:

将框架绑定到 EVT_CLOSE 事件 self.Bind(wx.EVT_CLOSE, self.on_close) 然后决定你想如何处理关闭事件,即

def on_close(self, event):
    if self.should_close:
        event.Skip() # calling event.Skip() will allow the window to close

【讨论】:

以上是关于限制关闭python应用程序(win32gui)的主要内容,如果未能解决你的问题,请参考以下文章

即使使用 Win32GUI,cx_Freeze 也会闪烁 cmd 窗口

Python 桌面程序开发 解决 win32gui 获取的位置不准的问题

Python 桌面程序开发 解决 win32gui 获取的位置不准的问题

Python win32gui 应用程序窗口闪烁

python win32gui模块下载

Python win32gui 获取窗口中虚拟光标的当前位置