怎样用python调用vc++编出来的win32 DLL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样用python调用vc++编出来的win32 DLL相关的知识,希望对你有一定的参考价值。
python调用vc中的API准备工作: 安装pywin32-210.5.win32-py2.5.exe
例1:最简单的MessageBox函数
import win32api, win32gui
import win32con, winerror,win32event,pywintypes
import sys, os,time
win32api.MessageBox(0,'hello', 'WYM',win32con.MB_OK)
例2:进程监控
#Mutex.py
mutex=None
mutex=win32event.CreateMutex(None,pywintypes.FALSE,"MutexWym")
if(win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS):
print"Opened existing mutex object", mutex
else:
print "Created new mutex"
time.sleep(10)
win32api.CloseHandle(mutex)
print "close Mutex"
time.sleep(10)
#MonitorProcess.py
import win32api, win32gui
import win32con, winerror,win32event ,pywintypes
import sys, os,time
STANDARD_RIGHTS_REQUIRED = 0x000F0000L
SYNCHRONIZE = 0x00100000L
MUTANT_QUERY_STATE = 0x0001
MUTEX_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE
try:
while 1:
time.sleep(2)
hMutex=win32event.OpenMutex(MUTEX_ALL_ACCESS,pywintypes.FALSE,"MutexWym")
print win32api.GetLastError()
if hMutex is not None:
print "Mutex open"
win32api.CloseHandle(hMutex)
else:
print "Mutex not open"
break
except pywintypes.error, (errno, object, strerror):
print "Error in", object, ":", strerror
如何使用kernel32的API呢
例3:
import pywintypes
import winerror, win32con
import win32api, win32event, win32file, win32pipe, win32process, win32security
import win32service, win32serviceutil, servicemanager,ntsecuritycon
from ctypes import * #本例包括这个头文件
hMutex = windll.kernel32.CreateMutexA(None, 0, "szMutex")
#其它API同理,比如像windll.kernel32.InitializeCriticalSection() 等等
a、python中涉及的windows下的类型?
通过pywintypes 可以获得这个数据类型
b、获得窗口句柄
通过FindWindow这API来查找相应的窗口的句柄,然后发消息给这个窗口,就可以实现这个功能
ct = win32api.GetConsoleTitle()
hd = win32gui.FindWindow(0,ct)
win32gui.ShowWindow(hd,0)
参考技术A 1、首选运行工具 makepy.py。
2、这样就可以查看 C# dll的 com导出的 py文件了。 Python编程makepy.py代码如下:
# -*- coding: mbcs -*-
# Created by makepy.py version 0.5.00
# By python version 2.5.4 (r254:67916, Dec 23 2008, 15:10:54)
也可以使用下面的方式:
然后保证你能找到这个dll, 比如在system32下
from ...
windll.aaa 就可以
用python win32 获得计算器里的计算结果
怎么获得计算结果 98
图片右边是用SPYXX捕获的数据
我需要的是直接用程序得到计算结果(上图中 98)
不用去操作计算器
给你一个思路。用 python 的 win32gui 可以枚举所有窗口句柄,想办法获取窗口句柄,然后通过 GetWindowText() 方法来获取窗口的标题,也就是结果所在的窗口句柄。
我用WIN32试了一下,我是hook了鼠标所在的句柄,但当鼠标指向结果时,结果的窗口句柄获取不到,只能获取到结果窗口的上一个窗口的句柄(也就是你图中的00280756的句柄),但可以通过枚举子窗口来获取(也就是枚举你图片中的002F0854句柄),然后经过一系列匹配和判断最终得到结果的值。
# encoding: gb2312import win32gui
def _MyCallback( hwnd, extra ):
hwnds = extra
hwnds.append(hwnd)
def _CallBack(hwnd, extra):
value, m_index = extra
if win32gui.GetClassName(hwnd) == 'Static':
m_index.append(None)
if len(m_index) == 4:
value.append(win32gui.GetWindowText(hwnd))
def TestEnumWindows():
windows = []
results = []
win32gui.EnumWindows(_MyCallback, (windows))
i = 0
for hwnd in windows:
if win32gui.GetClassName(hwnd) == 'CalcFrame':
m_index = []
win32gui.EnumChildWindows(hwnd, _CallBack, (results, m_index))
i += 1
for result in results:
print '计算器的结果为:' , result
TestEnumWindows()
这样更好一些,可能有些特征不同。我是枚举所有窗口,然后获取窗口的classname为CalcFrame的窗口,然后再枚举CalcFrame的子窗口,然后判断第4个出现的Static控件就是结果的控件。
参考以下:可以把结果保存在win32clipboard
import win32apiimport win32com.client
import win32clipboard
class CalcLib(object):
def __init__(self):
self.shell = win32com.client.Dispatch("WScript.Shell")
def launchCalc(self):
self.shell.Run("calc", 1)
self.delay()
def closeCalc(self):
self.shell.AppActivate("Calculator")
self.shell.SendKeys("%F4")
def click(self, key):
self.shell.AppActivate("Calculator")
if key in ["+", "^", "%", "~"]:
key = "" + key + ""
self.shell.SendKeys(key)
self.delay()
def input(self, num):
if num[0] == "-":
self.click(num[1:])
self.click("F9")
else:
self.click(num)
self.delay(2000)
def check(self, expected):
self.shell.AppActivate("Calculator")
self.click("^c")
self.delay()
win32clipboard.OpenClipboard()
actual = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
if expected != actual:
raise AssertionError, "Checking Result failed:" + expected + " != " + actual
def delay(self, ms=100):
win32api.Sleep(ms)
def setup(self):
self.launchCalc()
def teardown(self):
self.closeCalc()
def add(self, num):
self.shell.AppActivate("Calculator")
self.click("+")
self.input(num)
def equals(self, expected):
self.shell.AppActivate("Calculator")
self.click("=")
self.check(expected)
def multiply(self, num):
self.shell.AppActivate("Calculator")
self.click("*")
self.input(num)
def divide(self, num):
self.shell.AppActivate("Calculator")
self.click("/")
self.input(num)
if __name__ == '__main__':
pass追问
我想要直接得到结果而不用去操作计算器
追答就是上面的check方法啊,选中计算器,把结果拷贝到剪切板,不就有了吗。。
以上是关于怎样用python调用vc++编出来的win32 DLL的主要内容,如果未能解决你的问题,请参考以下文章