Search code examples
python-2.7wxpythonwin32gui

restrict close python application (win32gui)


I want to restrict the closing of an application by any user. how do I do it? disabling "close" button or making it "minimize" button?

This program will monitor copy paste of specific files so it has to run continuously on the system.

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 ()

Solution

  • bind the frame to the EVT_CLOSE event self.Bind(wx.EVT_CLOSE, self.on_close) and then decide how you want to handle the close event, ie

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