Hi, So I now thankfully have a simple wxPython script that creates a frame, etc... Now I want it to act like a well-behaved CE application. Ultimately, I'd like to post it to the wiki (at least as a hack). Hope the formatting in this email comes through alright! Any help is greatly appreciated.
From what I've learned recently, I want the script to:
1. start up the program without a shell, [see "\nopcceshell" registry arg] 2. and a simple tap on a unique icon for the program from the Start > Programs menu, Task bar, or File Explorer, etc. [make a shortcut in "\Windows\Start Menu\Programs"] 3. be minimized by the Smart Close button [no problem here] 4. then be uniquely iconized to the Start/Task Menu [sort of accomplished by #2] 5. and finally be brought forward again (maximized) when either the user again clicks on the Task menu (or any other shortcut to the script) [use win32gui.SetForegroundWindow(hwnd)] 6. (for now, trying to keep it simple, I'm not going to worry about the hibernation, memory events that could cause spurious problems) [wxEVT_ACTIVATE, etc.] I'm attaching the following script which almost accomplishes (5). How to accomplish (1-4) can be pieced together elsewhere. The main problem the script now has are: - if "\nopcceshell" is used, the busy clock persists [previous post but in example] but the running script is brought forward as expected. - if the pcceshell is used, and one calls [_pcceshell_support.Busy(0)], then the call on line 31, [frame_class = win32gui.GetClassName(frame.GetHandle())], returns the PythonCE shell and not the frame of the script. Best regards, Matt PS: In case the attachment gets scrubbed, simple_ce.py: import sys #, os, os.path, time
import win32gui window_handle_file = 'window_handle.txt' def buildUI(window_handle_file): # Write a file to save the window handle info f = open(window_handle_file, 'wb') # Start building the interface... import wx class SingleAppFrame(wx.Frame): def __init__(self,parent,id,title): wx.Frame.__init__(self,parent,-1, title, size = ( 300, 300)) self.Centre() class SingleApp(wx.App): def OnInit(self): ## Not implemented for PPC? # name = "SingleApp-%s" % (wx.GetUserId()) ## self.name = "SingleApp-%s" % (wx.GetUserId()) # self.instance = wx.SingleInstanceChecker(name) # if self.instance.IsAnotherRunning(): # wx.MessageBox("Another instance is running", "ERROR") # return False frame = SingleAppFrame(None, -1, "SingleApp") frame.Show() # Now get the window handle of the frame. frame_class = win32gui.GetClassName(frame.GetHandle()) print frame_class active_window = frame.GetHandle() f.write(str(active_window)) f.close() return True app = SingleApp(redirect=False) app.MainLoop() if sys.platform == 'win32': pass elif sys.platform == 'Pocket PC': # This gets rid of annoying pin/progress wheel. ala Luke. try: import _pcceshell_support except ImportError: pass else: _pcceshell_support.Busy(0) else: print 'This operating system (%s) is not recognized.'%(sys.platform) try: f = open(window_handle_file, 'rb') #f.write('win32gui\n') #SW_MAXIMIZE #win32gui.GetClassName(frame.GetHandle()) if sys.platform == 'win32': # If Window is minimized, this will maximize it. window = win32gui.FindWindow('wxWindowClassNR', 'SingleApp') window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE') # window = win32gui.ShowWindow(window, 1)#'SW_MAXIMIZE')# This doesn't set the window to the foreground. print window else: ########################################## # Unfortunately, when I use the following to bring the # frame forward, I instead get the pcceshell (labeled PythonCE) shell. # If I don't use the pcceshell, by altering the registry with, # \nopcceshell, # Then I get the busy clock and the frame window that I want! ########################################## hwnd = int(f.readline()) print hwnd window = win32gui.SetForegroundWindow(hwnd)#'SW_MAXIMIZE') ## Just other options but not exactly what I wanted. #window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE') #window = win32gui.FindWindow('PythonClassNameNR', 'SingleApp') #window = win32gui.ShowWindow(hwnd, 1)#window, 1)#'SW_MAXIMIZE') #win32gui.SetActiveWindow(hwnd)#window, 1)#'SW_MAXIMIZE') # Now, if the window was successfully shown, we'll be done here. # Otherwise, fire up the app... if window == 0: # Will be zero if window not brought to foreground. 'No window available, re-starting app' else: print 'The app should be visible!' except: buildUI(window_handle_file)
On 2/26/07, Matt S. <[EMAIL PROTECTED]> wrote:
Regarding new info I have about solving this problem, I'm thinking I either need to implement a WindowProc function that processes messages sent to the window, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windowprocedures/windowprocedurereference/windowprocedurefunctions/windowproc.asp or, hope that the WS_NONAVDONEBUTTON gets supported by wx and then ported to the PPC (or learn to compile, etc. myself), http://msdn2.microsoft.com/en-us/library/aa458799.aspx On 2/23/07, Luke Dunstan <[EMAIL PROTECTED]> wrote: > > As with any Pocket PC application (written in Python or otherwise), the > X "close" button merely hides a window and does not destroy it. The Pocket > PC platform is intended so that users don't need to "close" applications as > such, and if you open enough other applications that the memory starts to > become full, the OS will actually close (WM_CLOSE) some of the applications > that were hidden in the background. If you try clicking the X button on > any of the Microsoft's Pocket PC applications, e.g. Pocket Word, and > then look in the task manager you will notice that it is still running. > > You may be able to capture the event as WM_SHOWWINDOW. > > As with any Python program on the PC, your script is not a process but > is just a text file that is interpreted by the python.exe process. > > Luke > > > ----- Original Message ----- > *From:* Matt S. <[EMAIL PROTECTED]> > *To:* pythonce@python.org > *Sent:* Thursday, February 22, 2007 2:12 PM > *Subject:* [PythonCE] wxPython, handling close events > >
import sys #, os, os.path, time import win32gui window_handle_file = 'window_handle.txt' def buildUI(window_handle_file): # Write a file to save the window handle info f = open(window_handle_file, 'wb') # Start building the interface... import wx class SingleAppFrame(wx.Frame): def __init__(self,parent,id,title): wx.Frame.__init__(self,parent,-1, title, size = ( 300, 300)) self.Centre() class SingleApp(wx.App): def OnInit(self): ## Not implemented for PPC? # name = "SingleApp-%s" % (wx.GetUserId()) ## self.name = "SingleApp-%s" % (wx.GetUserId()) # self.instance = wx.SingleInstanceChecker(name) # if self.instance.IsAnotherRunning(): # wx.MessageBox("Another instance is running", "ERROR") # return False frame = SingleAppFrame(None, -1, "SingleApp") frame.Show() # Now get the window handle of the frame. frame_class = win32gui.GetClassName(frame.GetHandle()) print frame_class active_window = frame.GetHandle() f.write(str(active_window)) f.close() return True app = SingleApp(redirect=False) app.MainLoop() if sys.platform == 'win32': pass elif sys.platform == 'Pocket PC': # This gets rid of annoying pin/progress wheel. ala Luke. try: import _pcceshell_support except ImportError: pass else: _pcceshell_support.Busy(0) else: print 'This operating system (%s) is not recognized.'%(sys.platform) try: f = open(window_handle_file, 'rb') #f.write('win32gui\n') #SW_MAXIMIZE #win32gui.GetClassName(frame.GetHandle()) if sys.platform == 'win32': # If Window is minimized, this will maximize it. window = win32gui.FindWindow('wxWindowClassNR', 'SingleApp') window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE') # window = win32gui.ShowWindow(window, 1)#'SW_MAXIMIZE')# This doesn't set the window to the foreground. print window else: ########################################## # Unfortunately, when I use the following to bring the # frame forward, I instead get the pcceshell (labeled PythonCE) shell. # If I don't use the pcceshell, by altering the registry with, # \nopcceshell, # Then I get the busy clock and the frame window that I want! ########################################## hwnd = int(f.readline()) print hwnd window = win32gui.SetForegroundWindow(hwnd)#'SW_MAXIMIZE') ## Just other options but not exactly what I wanted. #window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE') #window = win32gui.FindWindow('PythonClassNameNR', 'SingleApp') #window = win32gui.ShowWindow(hwnd, 1)#window, 1)#'SW_MAXIMIZE') #win32gui.SetActiveWindow(hwnd)#window, 1)#'SW_MAXIMIZE') # Now, if the window was successfully shown, we'll be done here. # Otherwise, fire up the app... if window == 0: # Will be zero if window not brought to foreground. 'No window available, re-starting app' else: print 'The app should be visible!' except: buildUI(window_handle_file)
_______________________________________________ PythonCE mailing list PythonCE@python.org http://mail.python.org/mailman/listinfo/pythonce