Python 如何获得一个Windows程序窗口,并在窗口里的当前

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 如何获得一个Windows程序窗口,并在窗口里的当前相关的知识,希望对你有一定的参考价值。

你好,
1、读取windows窗口,应该要用系统编程的知识实现接口,然后python调用
python 没有直接能实现该功能的模块
2、或者,你需要调用win32 api了已经不是python的标准范围

你可以看看 Pywin32 这个扩展库
参考技术A VC++工具里面的 spy++ 里面有个FindWindow的功能,然后直接移到子窗口上,就会看到子窗口的类名了 如果你要程序实现,那就尝试一下EnumChildWindow

用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 如何获得一个Windows程序窗口,并在窗口里的当前的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在Windows下编写在后台一直运行的Python程序

如何防止程序完成执行时关闭命令窗口

python怎么判断windows下的某一个窗口是不是当前正在操作的

WPF虚拟键盘如何不获得当前焦点

在Windows上通过命令窗口运行Python脚本程序