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

怎么获得计算结果98图片右边是用SPYXX捕获的数据我需要的是直接用程序得到计算结果(上图中98)不用去操作计算器... 怎么获得计算结果 98
图片右边是用SPYXX捕获的数据
我需要的是直接用程序得到计算结果(上图中 98)
不用去操作计算器
展开
 我来答
xixuyishi
2013-08-11 · 超过27用户采纳过TA的回答
知道答主
回答量:81
采纳率:100%
帮助的人:76.4万
展开全部

给你一个思路。用 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控件就是结果的控件。

kanchi240
2013-08-09 · TA获得超过363个赞
知道小有建树答主
回答量:151
采纳率:100%
帮助的人:113万
展开全部

参考以下:可以把结果保存在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方法啊,选中计算器,把结果拷贝到剪切板,不就有了吗。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式