How to use Win32 API with Python?
Asked Answered
I

3

65

How can I use win32 API in Python? What is the best and easiest way to do it?
Can you please provide some examples?

Insinuation answered 21/6, 2009 at 23:37 Comment(5)
yes, i actually did it before asking the question, and found several results. my aim is to start learning the most recommended solution to my problem. besides, not such question has been asked in stack overflow before, so I thought good answers from more experienced programmers can show the right path to take for beginners like me =)Insinuation
I googled and followed the links and I still don't know how.Toxicogenic
Is there a specific use case? what are you trying to do that is not part of the standard python library?Hoitytoity
@SashaChedygov you're welcome! It's never late to learn mistakes.Sherrilsherrill
Just reading down through the comments and @SashaChedygov's one stuck out. Believe it or not, I got here by Googling. This is now (14 years later?) the topmost entry in the list of found articles. Ironic?Zennas
M
47

PyWin32 is the way to go - but how to use it? One approach is to begin with a concrete problem you're having and attempting to solve it. PyWin32 provides bindings for the Win32 API functions for which there are many, and you really have to pick a specific goal first.

In my Python 2.5 installation (ActiveState on Windows) the win32 package has a Demos folder packed with sample code of various parts of the library.

For example, here's CopyFileEx.py:

import win32file, win32api
import os


def ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred,
    StreamNumber, CallbackReason, SourceFile, DestinationFile, Data):
    print Data
    print TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred, StreamNumber, CallbackReason, SourceFile, DestinationFile
    ##if TotalBytesTransferred > 100000:
    ##    return win32file.PROGRESS_STOP
    return win32file.PROGRESS_CONTINUE

temp_dir=win32api.GetTempPath()
fsrc=win32api.GetTempFileName(temp_dir,'cfe')[0]
fdst=win32api.GetTempFileName(temp_dir,'cfe')[0]
print fsrc, fdst

f=open(fsrc,'w')
f.write('xxxxxxxxxxxxxxxx\n'*32768)
f.close()
## add a couple of extra data streams
f=open(fsrc+':stream_y','w')
f.write('yyyyyyyyyyyyyyyy\n'*32768)
f.close()
f=open(fsrc+':stream_z','w')
f.write('zzzzzzzzzzzzzzzz\n'*32768)
f.close()

operation_desc='Copying '+fsrc+' to '+fdst
win32file.CopyFileEx(fsrc, fdst, ProgressRoutine, operation_desc, False,   win32file.COPY_FILE_RESTARTABLE)

It shows how to use the CopyFileEx function with a few others (such as GetTempPath and GetTempFileName). From this example you can get a "general feel" of how to work with this library.

Miscreance answered 22/6, 2009 at 3:4 Comment(1)
Style remark: 3 open(fn, 'w').write('data') lines in CPython communicate the same message as 9 'open,write,close' lines.Wrinkle
A
26

PyWin32, as mentioned by @chaos, is probably the most popular choice; the alternative is ctypes which is part of Python's standard library. For example, print ctypes.windll.kernel32.GetModuleHandleA(None) will show the module-handle of the current module (EXE or DLL). A more extensive example of using ctypes to get at win32 APIs is here.

Amortization answered 21/6, 2009 at 23:51 Comment(2)
@RadimCernej: Try a google search for import ctypes github. You will get many hits. Or try this example on GitHub that uses from ctypes import *: github.com/erochest/snippets/blob/master/win32named.pySlav
They have not gotten pyWin32 to work with the MSYS2 build of Python. CTypes does.Canescent
H
8

The important functions that you can to use in win32 Python are the message boxes, this is classical example of OK or Cancel.

result = win32api.MessageBox(None,"Do you want to open a file?", "title",1)



  if result == 1:
     print 'Ok'
  elif result == 2:
     print 'cancel'

The collection:

win32api.MessageBox(0,"msgbox", "title")
win32api.MessageBox(0,"ok cancel?", "title",1)
win32api.MessageBox(0,"abort retry ignore?", "title",2)
win32api.MessageBox(0,"yes no cancel?", "title",3)
Hinny answered 6/8, 2012 at 15:16 Comment(2)
Is there an option to display a hyperlink in such a MessageBox (or similar) with win32api?Hammerfest
Where does your win32api object come from?Iodism

© 2022 - 2024 — McMap. All rights reserved.