ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python中的简单热键脚本-如何设置全局热键以发送文本字符串?

2019-11-02 20:56:13  阅读:397  来源: 互联网

标签:pywin32 wxpython python


我想知道如何将wxPython与win32apis一起使用来创建一个简单的脚本,该脚本将激活具有特定标题和输出文本(按键)的窗口(如果尚未激活).一种可能的应用是游戏中的键盘快捷键.我已经阅读了wxPython RegisterHotKey()的内容,但是-作为一名业余Python程序员-我不清楚.
该脚本的基本结构为:

>定义热键(类似于win F_)
>注意热键按键
>查看所需的窗口(标题)是否已经激活,如果尚未激活,请激活它
>模拟某些文本的输入

我知道有更简单的方法可以完成此操作(例如AutoHotkey),但是使用我自己编写的并且对Python感兴趣的东西使我感到更自在.
谢谢!

作为记录,我在Windows 7 AMD64上使用Python 2.7,尽管我怀疑解释器版本/平台/体系结构在这里是否有很大不同.

解决方法:

您是在谈论激活在wx或单独的应用程序(如记事本)中创建的窗口吗?如果与wx一起使用,那就微不足道了.您只需使用Raise()即可将所需的任何框框对准焦点.您可能会使用PubSub或PostEvent来使子帧知道需要提升.

如果您在谈论记事本,那么事情会变得更加棘手.这是我根据从网络上各个位置和PyWin32邮件列表获得的一些东西创建的一个丑陋的hack:

def windowEnumerationHandler(self, hwnd, resultList):
    '''
    This is a handler to be passed to win32gui.EnumWindows() to generate
    a list of (window handle, window text) tuples.
    '''

    resultList.append((hwnd, win32gui.GetWindowText(hwnd)))

def bringToFront(self, windowText):
    '''
    Method to look for an open window that has a title that
    matches the passed in text. If found, it will proceed to
    attempt to make that window the Foreground Window.
    '''
    secondsPassed = 0
    while secondsPassed <= 5:
        # sleep one second to give the window time to appear
        wx.Sleep(1)

        print 'bringing to front'
        topWindows = []
        # pass in an empty list to be filled
        # somehow this call returns the list with the same variable name
        win32gui.EnumWindows(self.windowEnumerationHandler, topWindows)
        print len(topWindows)
        # loop through windows and find the one we want
        for i in topWindows:
            if windowText in i[1]:
                print i[1]
                win32gui.ShowWindow(i[0],5)
                win32gui.SetForegroundWindow(i[0])
        # loop for 5-10 seconds, then break or raise
        handle = win32gui.GetForegroundWindow()
        if windowText in win32gui.GetWindowText(handle):
            break
        else:
            # increment counter and loop again                
            secondsPassed += 1

然后,我使用SendKeys包将文本发送到窗口(请参见http://www.rutherfurd.net/python/sendkeys/).如果用户打开其他任何内容,脚本将中断或发生奇怪的事情.如果您打开类似MS Office的窗口,请使用win32com而不是SendKeys.那要可靠得多.

标签:pywin32,wxpython,python
来源: https://codeday.me/bug/20191102/1994243.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有