Creating a window from PyHandle? Possible?
Roger Upole
rupole at hotmail.com
Sun Oct 10 14:33:36 EDT 2004
The basic problem is that the handle returned from GetPage is not an MFC
object, and win32ui is expecting an MFC property sheet page, not a raw
handle.
I played around with this a while back, and managed to display the property
page
by sending the window message PSM_ADDPAGE to a PyCPropertySheet.
However, you can't use SendMessage until you've called CreateWindow for the
property sheet, and you can't call CreateWindow until you've added a
property
page. (catch-22!) I got around this by adding a dummy page to the property
sheet,
calling CreateWindow & SendMessage to add the task page, and then removing
the stand-in. But since the task page isn't MFC, after I did that any
attempt to call methods on the property sheet caused an access violation.
Roger
import win32api,win32con, win32ui, pythoncom
import traceback, os
from win32com.taskscheduler import taskscheduler
PSM_ADDPAGE = win32con.WM_USER + 103
PSM_REMOVEPAGE = win32con.WM_USER + 102
task_name='test_addtask_4.job'
ts=pythoncom.CoCreateInstance(taskscheduler.CLSID_CTaskScheduler,None,
pythoncom.CLSCTX_INPROC_SERVER,taskscheduler.IID_ITaskScheduler)
t=ts.Activate(task_name)
iptp=t.QueryInterface(taskscheduler.IID_IProvideTaskPage)
tp=iptp.GetPage(taskscheduler.TASKPAGE_TASK,False)
fname=os.path.join(os.environ['SYSTEMROOT'],'system32','mstask.dll')
dll=win32ui.LoadLibrary(fname)
try:
dll.AttachToMFC()
except:
traceback.print_exc()
ps=win32ui.CreatePropertySheet('eh ?????')
## property sheet won't let you CreateWindow unless there's already a
property page attached,
## and you can't do a SendMessage until you've created a window !!!!
pptask=win32ui.CreatePropertyPage(401) ## 401 is the task page template from
mstask.dll, identified using EnumResources
ps.AddPage(pptask)
ps.CreateWindow()
ps.SendMessage(PSM_ADDPAGE,0,tp)
## get rid of the dummy
ps.RemovePage(0)
"Fadly Tabrani" <no at spam.net> wrote in message
news:ckaq81$50h$1 at mawar.singnet.com.sg...
> Hi guys,
>
> This is the first time I'm posting to the newsgroup, hope you can help
out.
>
> I'm writing a module to interface with the task scheduler in windows
> using PyWin32. Everything has been great so far but I'm stuck on
> displaying the propertys page of a task. Here's the code:
>
> import pythoncom
> import win32api
> from win32com.taskscheduler import taskscheduler
> import win32ui
>
> task_scheduler = pythoncom.CoCreateInstance\
> (taskscheduler.CLSID_CTaskScheduler,
> None, pythoncom.CLSCTX_INPROC_SERVER,
> taskscheduler.IID_ITaskScheduler)
>
> def show_schedule_page(task_name):
>
> TASKPAGE_TASK = 0,
> TASKPAGE_SCHEDULE = 1,
> TASKPAGE_SETTINGS = 2
>
> try:
> task = task_scheduler.Activate(task_name)
> except pythoncom.com_error, e:
> print 'Task name not found...'
> return
>
> # ** This returns a PyHandle
> handle =
task.QueryInterface(taskscheduler.IID_IProvideTaskPage).\
> GetPage(1, True)
>
> # ** Can't create a window with it using win32ui, returns error
> try:
> win32ui.CreateWindowFromHandle(handle)
> except win32ui.error, e:
> print e
>
> # ** Can't add it to a property sheet, return an error
> property_sheet = win32ui.CreatePropertySheet('Task Schedule')
> try:
> property_sheet.AddPage(handle)
> except (win32ui.error, TypeError), e:
> print e
>
> show_schedule_page('task1')
>
> Any ideas on how to do it? The task schduler api reference is at
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/taskschd/taskschd/task_scheduler_start_page.asp
>
> I'm pretty new at this, is there anything that I've missed out?
>
> Cheers,
> Fadly Tabrani
> python loves me loves python
More information about the Python-list
mailing list