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