怎样用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: gb2312

import 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控件就是结果的控件。

参考技术A

参考以下:可以把结果保存在win32clipboard

import win32api
import 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的主要内容,如果未能解决你的问题,请参考以下文章

用python win32 获得计算器里的计算结果

vc,mfc,api,windows编程,win32(sdk),gui学习的顺序是怎样的,本人迷茫中!!

用python操作Windows的计算器。

python可以直接调用win32的api吗

怎样用vs 2008 编译C程序

如何在win32编程中,在同一个窗口下播放多个音乐