前些日子,由于需要,用python写了个小插件,通过win32api 访问外部程序的窗口 并且做些小操作。

因为原来对win32api 不怎么熟悉 所以只好求救。群里有个QQ:32034767 唐骁勇 tsy_007@163.com

这小伙子不错 心热人善

动手之前要选对好工具。(既然是基于WIN32api 当然要用微软的专用的spyxx.exe,上手相当简单。比较专业 ,能查出当前桌面上所有的窗口句柄和类型。VC的那个绿色版的 spy++效果不强(Au3Info.exe也一样),无法追踪多级子窗口。 下面是简易代码:(实际上就是用钩子原理 网络上也可以找到)

import win32ui,win32con,pyHook,pythoncom,win32gui ,wx
        def hookhandle(event):
           
            if event.KeyID==9:#tab键值
                try:
                    pwin=win32ui.FindWindow('AfxMDIFrame70',None)#主窗口 AfxMDIFrame70就是你用#spyxx.exe查找到的窗口类名
                    pwin1=win32ui.FindWindowEx(pwin,None,'MDIClient',None)
                    pwin2=win32ui.FindWindowEx(pwin1,None,'AfxFrameOrView70',None)
                    pwin3=win32ui.FindWindowEx(pwin2,None,"AfxOleControl70",None)
                    pwin4=win32ui.FindWindowEx(pwin3,None,None,"PatientCardControl Frame")#可以根据窗口#的标题名称查找 标题名称一般外接程序是不变的 而类名有时是变化的 比如机器重启 关闭等
                    pwin5=win32ui.FindWindowEx(pwin4,None,"AfxMDIFrame70",None)
                    pwin6=win32ui.FindWindowEx(pwin5,None,"AfxWnd70",None)
                    pwin7=win32ui.FindWindowEx(pwin6,None,"#32770",None)

textbox=pwin7.GetDlgItem(222)#获取控件的ID
                    textbox2=pwin7.GetDlgItem(224)

buf='0x0'*1024
                    buf2='0x0'*1024
                    textbox.SendMessage(win32con.WM_SETTEXT,"")#先清空控件内容
                    textbox2.SendMessage(win32con.WM_SETTEXT,"")

oldlen=textbox.SendMessage(win32con.WM_GETTEXT,buf)
                    oldlen2=textbox2.SendMessage(win32con.WM_GETTEXT,buf2)

textbox.SendMessage(win32con.WM_SETTEXT,buf[0:oldlen]+str(blh))#发送消息 注意不能##用%s 替换 所以一般需要全局变量 来替换
                    textbox2.SendMessage(win32con.WM_SETTEXT,buf2[0:oldlen]+str(name))
                except:
                    wx.LogMessage('没有发现可用的窗口!请确保程序已经运行')

hm = pyHook.HookManager()#初始实例
        hm.KeyDown=hookhandle
        hm.HookKeyboard()
        pythoncom.PumpMessages(5000)#据说是winctype的新功能 延迟吧 具体什么也不清楚
        hm.UnhookKeyboard()#释放键盘捕捉 好像效果不明显
        #for i in range (0,40):
            #win32api.Sleep(20)
            #if win32ui.PumpWaitingMessages(0,-1):
        win32api.PostQuitMessage(0)# 退出监控消息 很关键 必须配合sys.setrecursionlimit(4000)使用效果##才明显 不然的话 程序无法退出。
               #raise exceptions.SystemExit

def OnClose(self, event):
        sys.setrecursionlimit(4000)#相当关键
        self.Close(True)
        self.Destroy()

python win32api 使用小技巧的更多相关文章

  1. 我做的python常用的小技巧

    在python编码过程中,总会遇到各种各样的小问题,我想着记录下来,以备查用,总结过去,是为了更好的思考与进步. 一. 去除变量中(标题中)多余的字符 数据处理过程中,遇到这样的情况: y=['月份' ...

  2. python编程常见小技巧

    #主要是记录常见的小问题以及解决办法 ##1.复制的代码,经常出现TAB和空格不一致的情况 将tab或者空格删除,然后重新打出空格或者tab就可以了: ##2.python读取文件,经常出现的编码en ...

  3. Python爬虫常用小技巧之设置代理IP

    设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...

  4. Python性能提升小技巧

    第一部分 1-使用内建函数: 你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速 2-使用 join() 连接字符串. 你可以使用 + 来连接字符串. 但由于string ...

  5. python运维小技巧

    以下实验均在Linux上进行 1.一秒钟启动一个下载服务器 python版本 python2:  #python -m SimpleHTTPServer Serving HTTP on 0.0.0.0 ...

  6. python Selenium+phantomjs 小技巧

    1.元素模糊定位 如抓取下面列表: elements = doc("li[id^='result_']") 2.元素精确定位 elements =doc("div[cla ...

  7. python json模块小技巧

    python的json模块通常用于与序列化数据,如 def get_user_info(user_id): res = {"user_id": 190013234,"ni ...

  8. python 小兵之小技巧

    用for循环打印数字从1开始 for a in range(1,num+1): 用split切割字符串可以用索引选择部分 int(el.split("_")[1]) range 第 ...

  9. python 的一些小技巧

    赋值: a, b, c = 'xixi', 'haha', 'hehe' 连接字典: >>> s = {1:'a', 2:'b', 3:'c'} >>> s.key ...

随机推荐

  1. sqlplus中怎么将你全部的操作和结果记录保存到你指定的文件里

    [在sqlplus的操作中,非常多时候我们都想把自己的写的sql语句和改动日志或者结果信息做记录] [首先]肯定要正常连接到oralce数据库. [然后] 你用你指定的用户登录到oralce数据库之后 ...

  2. POJ 题目2506Tiling(大数)

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8128   Accepted: 3941 Descriptio ...

  3. webuploader 小demo

    页面写法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. angular组件间的信息传递

    原文 https://www.jianshu.com/p/82207f2249c1 大纲 1.父组件向子组件传递信息:通过属性 2.子组件向父组件传递信息:通过事件 3.父组件获取子组件的信息:通过调 ...

  5. 从Lua调用C

    从Lua调用C: 方式:C函数从栈中获取函数參数(第一个參数总是局部栈的索引1),将结果压入栈中,C函数须要返回结果数量. 每一个函数都有自己的局部私有栈 样例: static int l_sin(l ...

  6. itunes app 下载链接的几种表现形式

    第一种:itunes://itunes.apple.com/cn/app/id794862904 ,这是最普通的一种. 直接在浏览器中输入.就能够打开电脑上安装的itunes,并跳转到相应的app下载 ...

  7. 事件处理之二:点击事件监听器的五种写法 分类: H1_ANDROID 2013-09-11 10:32 4262人阅读 评论(1) 收藏

    首选方法二! 方法一:写一个内部类,在类中实现点击事件 1.在父类中调用点击事件 bt_dail.setOnClickListener(new MyButtonListener()); 2.创建内部类 ...

  8. Android中动态设置GridView的列数、列宽和行高

    在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的.但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量 ...

  9. pycharm highlight

    https://www.jetbrains.com/help/pycharm/2017.1/highlighting-usages.html Highlighting usages in the cu ...

  10. Double prefix overrides to provide 16-bit operand size in a 32/64 operating mode

    A processor supports an operating mode in which the default address size is greater than 32 bits and ...