###场景

定时获取数据接口数据写入Excel表格,Excel需要被其他程序使用,需要处于开启状态。

###Pywin32

首先,安装一个Pywin32,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。其次,为了方面查找目标窗口的句柄,可以下载一个微软自家的Spy++,这玩意儿满大街都是。有了它,还能很方便的查看窗体的消息。

句柄是一个32位整数,在windows中标记对象用,类似一个dict中的key。

消息是windows应用的重要部分,用来告诉窗体“发生了什么”,比如给一个按钮发送BN_CLICKED这么个消息,按钮就知道“哦,我被点了”,才能执行相应的下一步操作。本文将大量使用消息机制。详情参看这篇文章。

查找窗体句柄

貌似在win32编程的世界里,包括窗口到文本框的所有控件就是窗体,所有的窗体都有独立的句柄。要操作任意一个窗体,你都需要找到这个窗体的句柄,这里,我们就可以用到FindWindow函数和FindWindowEx函数。在pywin32中,他们都属于win32gui的模块。

####FindWindow(lpClassName=None, lpWindowName=None):

描述:自顶层窗口(也就是桌面)开始搜索条件匹配的窗体,并返回这个窗体的句柄。不搜索子窗口、不区分大小写。找不到就返回0

参数:

lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。

lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。

说明:这个函数我们仅能用来找主窗口。

####FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None);

描述:搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。不区分大小写,找不到就返回0。

参数:

hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体。

hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。

lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。

lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。

说明:找到了主窗口以后就靠它来定位子窗体啦。

###菜单操作

有了句柄,我们就可以操作FaceGen了!嗯,要先打开文件,File→Open,然后再File→Save Image(很悲剧,Save Image没有快捷键,所以不得不进行菜单操作)。现在我们有了FindWindow和FindWindowEx,要怎么操作菜单呢?

哦,抱歉,靠他俩还做不到。

窗口的菜单就像窗口的标题栏一样,是窗口自身的一部分,不是其他窗体控件,也就没有办法用FindWindow和FindWindowEx返回句柄。所以要对菜单进行操作的话,我们需要新的函数,也就是GetMenu,GetSubMenu和GetMenuItemID,它们也都属于win32gui模块。结合下图来说:

####PostMessage(hWnd, Msg, wParam, lParam)

描述:在消息队列中加入为指定的窗体加入一条消息,并马上返回,不等待线程对消息的处理。

参数:

hWnd:整型,接收消息的窗体句柄

Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages)

wParam:整型,消息的wParam参数

lParam:整型,消息的lParam参数

说明:简单说,就是给指定程序发一个消息,这些消息都用整型编好号,作为windows的常量可以查询的。在这里,我们用的就是win32con这个库里定义的WM_COMMAND这个消息,具体的wParam和lParam是根据消息的不同而不同的。具体请根据MSDN查阅。

####GetMenu(hwnd)

描述:获取窗口的菜单句柄。

参数:

hwnd:整型,需要获取菜单的窗口的句柄。

说明:获取的是插图中黄色的部分。

####GetSubMenu(hMenu, nPos)

描述:获取菜单的下拉菜单或者子菜单。

参数:

hMenu:整型,菜单的句柄,从GetMenu获得。

nPos:整型,下拉菜单或子菜单的的索引,从0算起。

说明:这个可以获取插图中蓝色的部分;如描述所述,这个不仅可以获取本例中的下拉菜单,还可以获取子菜单。

####GetMenuItemID(hMenu, nPos)

描述:获取菜单中特定项目的标识符。

参数:

hMenu:整型,包含所需菜单项的菜单句柄,从GetSubMenu获得。

nPos:整型,菜单项的索引,从0算起。

说明:这个获取的就是红色区域中的项目啦,注意,分隔符是被编入索引的,所以Open的索引是2而非1,而Exit的索引是9而非6。

###控件操作

在这里,我们用了SendMessage而不是PostMessage,其区别就在于我们可以通过SendMessage取得消息的返回信息。因为对于我们要设置文本框信息的WM_SETTEXT信息来说,设置成功将返回True。

####SendMessage(hWnd, Msg, wParam, lParam)

描述:在消息队列中加入为指定的窗体加入一条消息,直到窗体处理完信息才返回。

参数:

hWnd:整型,接收消息的窗体句柄

Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages)

wParam:整型,消息的wParam参数

lParam:整型,消息的lParam参数

说明:wParam和IParam根据具体的消息不同而有不同的定义,详情参阅Part 2.

###问题

在开发机器上是可以正常运行的,但是换在其他机器上就会报1400的错误

盐池数据同步已开启 >> 西部绿谷数据.xls

盐池数据本次同步已完成 时间 2018-03-16 14:34:01 数据60分钟后更新 >> 西部绿谷数据.xls

Traceback (most recent call last):

File "data_acquisition_3600.py", line 414, in

pywintypes.error: (1400, 'CloseWindow', '\xce\xde\xd0\xa7\xb5\xc4\xb4\xb0\xbf\xda\xbe\xe4\xb1\xfa\xa1\xa3')

Failed to execute script data_acquisition_3600

pywintypes.error 1400 开始以为是编码问题,发现还是找不到窗口句柄,后来发现获取窗口句柄和进程中的名字有关,不同版本的操作系统、Excel的窗口名称和进程名都不一致,需要特别注意。

进程名

窗口名

###代码

# -*- coding:utf-8 -*-

"""

Created on 2018/3/12

@author: jj

"""

import urllib

import json

import xlwt

import copy

import time

import os

import win32gui

import win32con

def write_ex(data):

"""

数据 写 文件

:param data:

:return:

"""

file = xlwt.Workbook(encoding='utf-8')

table = file.add_sheet("sheet1")

params = ['类型', '项目名称', '设备编号', '阀门开关', '泵1开关', '泵2开关', '水位', '上报时间', '水池大小', '管径']

params_code = ['leixing', 'name', 'code', 'famen', 'ben1', 'ben2', 'shuiwei', 'date', 'daxiao', 'guanjing']

for index, item in enumerate(params):

table.write(0, index, item)

table.write(0, 10, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

for l_index, equipment in enumerate(data):

for j_index, item in enumerate(params_code):

table.write(l_index+1, j_index, equipment.get(item))

filename = u"西部绿谷数据.xls"

file_path = os.path.join(filename)

file.save(file_path)

if __name__ == '__main__':

print u'盐池数据同步已开启 >> 西部绿谷数据.xls'

while True:

get_api()

print u'盐池数据本次同步已完成 时间 %s 数据5分钟后更新 >> 西部绿谷数据.xls' % time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))

os.startfile(u"西部绿谷数据.xls") # 打开文件

wndtitle = u"西部绿谷数据.xls [兼容模式] - Excel" # 进程名

wndclass = None

wnd = win32gui.FindWindow(wndclass, wndtitle) # 获取窗口句柄

win32gui.CloseWindow(wnd) # 窗口最小化

time.sleep(300)

win32gui.SendMessage(wnd, win32con.WM_CLOSE) # 关闭窗口

pythonwindow程序窗体操作_python操作Windows窗口程序相关推荐

  1. 基于列表框的简单选课窗体开发。编写Windows应用程序,设计实现一个简单选课系统,要求:(1)点击“添加”按钮,将把在第一文本框中的输入的课程名称添加到左边的列表框中,且所添加的课程不能为空,不能

    基于列表框的简单选课窗体开发.编写Windows应用程序,设计实现一个简单选课系统,要求: (1)点击"添加"按钮,将把在第一文本框中的输入的课程名称添加到左边的列表框中,且所添加 ...

  2. Windows 窗口程序的运行过程

    如图所示: 操作系统角度: Windows内核中维护了两个消息队列:系统消息队列 程序消息队列(采用虚拟内存,故对一个程序来说,只能看到自己的那份消息队列里的内容) 用户的各种I/O操作,先被操作系统 ...

  3. C++ Windows窗口程序:子窗口控件之按钮类button

    Windows窗口程序设计中,按钮.文本编辑框等控件都作为一个子窗口在WM_CREATE事件中创建的.其中按钮类button有多种类型和风格,常见的单选钮.复选钮.分组框也在此类中,见下表: 子窗口控 ...

  4. 模仿dos窗口下的windows窗口程序

    本程序含有不明bug,有时候退格之后,再击键会不听使唤...也许是因为,windows其他程序对内核的占用而导致了本程序部分键盘码丢失吧,具体原因不明. #include <windows.h& ...

  5. Windows游戏开发感想一个完整的Windows窗口程序

    现在的互联网行业从事Windows游戏开发的人实在是太少了.一是因为门槛较高,游戏行业本来就是互联网行业最尖端的领域,要想从事游戏开发,不仅要掌握一门过硬的语言,尤其是对C++的精通,还要对算法非常精 ...

  6. Windows窗口程序运行过程

    现在,简单介绍下windows应用程序的大概运行过程,让刚开始接触Windows开发或者MFC开发的同学有一个大致的了解. 1.创建一个窗口首先要注册一个窗口类,初始化wndclass中的各个域,设置 ...

  7. 计算机启动应用程序的方法,怎么启动Windows应用程序

    今天学习啦小编给大家介绍一下怎么启动Windows应用程序吧.供大家参考! 电脑基础知识-启动Windows应用程序 参考如下: [方法一] 第一步:在桌面上单击"开始"一&quo ...

  8. python窗口程序-python操作Windows窗口程序

    如果你想看更多舒适的布局和守时,有干货推动现场每天8点.定期获得数据接口和数据写入Excel表.Excel需要使用其他程序和需要打开.Pywin32处理是一个32位整数,用于标记对象在windows中 ...

  9. Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)

    转自:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html 我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其 ...

最新文章

  1. 北大OJ百练——3179:最长单词(C语言)
  2. Facebook全面推出Watch Party,可多人线上同看直播视频
  3. 100万“愤怒的小鸟”:中国手机开发者生存调查
  4. C++ Primer 第五版 第6章 6.1——函数及函数定义及调用阅读笔记
  5. [NOIP2010]关押罪犯(二分+二分图染色)
  6. 114实名认证未通过_企业微信怎么实名认证?实名认证后还可以改吗?
  7. Windows 10 终于干掉了 Windows 7!
  8. 厉害了,2019-2020中国互联网趋势报告
  9. python划分训练集、验证集和测试集
  10. 直播APP源码(干货):搭建直播平台的具体方案
  11. 储量级别122b_储量级别代码是什么
  12. 动漫学日语《白熊咖啡厅》(更新中)
  13. 微信转发指定的图文消息到朋友圈(JAVA版)
  14. nmn是真的还是假的,如何鉴别高质量的nmn,方法一览
  15. CUDA安装和检测【全】(nvcc命令找不到的解决办法)
  16. D3D初学入门一(配置开发环境及绘制D3D窗口)
  17. 常用的一些javascript小技巧(收藏http://www.car371.com/article.asp?id=13)
  18. Windows 10 更新遇到错误代码 0x80240034 的解决方法
  19. 各种开机画面的S905L3A/AB通刷包B863AV3.1-M2/3.2-M/311-1A/1AS/M401A/E900V22C/D
  20. 莫名其妙的中了流氓软件

热门文章

  1. Android FrameWork——Binder机制详解(1)
  2. Electron-日志与崩溃收集
  3. 【HASH】【UVA 10125】 Sumset
  4. 洛谷3672:小清新签到题——题解
  5. 在CentOS7上实现NFS共享
  6. 利用单壁路由实现vlan间路由
  7. indy9 indy10 MD5 实现方法
  8. noSql-redis
  9. Select prototyping tools
  10. delete删除重复记录方法