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

Python中的简单热键脚本-如何设置全局热键以发送文本字符串?,python,wxpython,pywin32,Python,Wxpython,Pywin32,我想知道如何使用wxPython和win32api来创建一个简单的脚本,该脚本将激活一个具有特定标题和输出文本(击键)的窗口(如果尚未激活)。一个可能的应用是游戏中的键盘快捷键。我已经阅读了wxPython RegisterHotKey(),但作为一名业余Python程序员,我并不清楚这一点。 脚本的基本结构将是: 定义热键(类似于win+F_) 注意热键击键 查看所需窗口(标题)是否已处于活动状态,如果未处于活动状态,则将其激活 模拟某些文本的键入 我知道有更简单的方法可以实现这一点(如Aut

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

  • 定义热键(类似于win+F_)
  • 注意热键击键
  • 查看所需窗口(标题)是否已处于活动状态,如果未处于活动状态,则将其激活
  • 模拟某些文本的键入
  • 我知道有更简单的方法可以实现这一点(如AutoHotkey),但我觉得使用我自己编写的并且对Python感兴趣的东西更舒服。
    谢谢


    作为记录,我在Windows7AMD64上使用的是Python 2.7,尽管我怀疑解释器版本/平台/体系结构在这里有多大区别。

    您是说激活在wx中创建的窗口还是单独的应用程序,如记事本?如果是wx,那么它是微不足道的。您只需使用Raise()将所需的任何帧置于焦点。您可能会使用PubSub或PostEvent让子帧知道它需要提升

    如果你说的是记事本,那么事情就会变得更加棘手。这是一个丑陋的黑客,我是根据我从网络上的不同位置和PyWin32邮件列表中得到的一些东西创建的:

    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
    
    def windowEnumerationHandler(self、hwnd、resultList):
    '''
    这是要传递给win32gui.EnumWindows()以生成
    (窗口句柄、窗口文本)元组的列表。
    '''
    追加((hwnd,win32gui.GetWindowText(hwnd)))
    def bringToFront(自身,窗口文本):
    '''
    方法查找标题为
    匹配传入的文本。如果找到,它将转至
    尝试使该窗口成为前景窗口。
    '''
    secondsPassed=0
    
    同时,我向你表示感谢!我将SendKeys视为一种可能性,然而,最新的版本是针对Python 2.6的,虽然它很可能是向后兼容的,但自安装程序会专门寻找匹配的Python版本。此外,通过“…脚本将中断或发生奇怪的事情”,您的意思是如果用户在发送击键时切换窗口?是的,如果用户在脚本运行时切换窗口,那么SendKeys将继续向任何焦点发送键,这可能会让你感到困惑,如果你没有预料到的话。这不是一个很大的问题,但是如果是的话,那么在:
    时使用
    就不能解决它吗?在代码中,我在哪里替换窗口标题?最后,Python2.6的SendKeys是否与Python2.7配合使用;我是否只是手动将源代码提取到所需的模块目录中?我讨厌Windows作为开发平台;我一直懒得重新安装Ubuntu,讽刺的是,我安装了明显冲突的Python包,破坏了Ubuntu的启动顺序。我想你可以使用while循环查询当前关注的窗口,看看它是否是正确的标题。调用bringToFront(“windowTitle”)运行脚本。我还没有尝试从源代码安装SendKeys,但它应该可以工作。只需提取归档文件,打开命令shell并导航到它。然后执行“pythonsetup.py安装”。如果他没有包含setup.py,那么是的,您通常可以将其解压缩到正确的位置