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

时间:2011-03-19 21:49:41

标签: python wxpython pywin32

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

  1. 定义热键(类似win + F_)
  2. 注意热键击键
  3. 查看所需的窗口(标题)是否已激活,如果不是
  4. ,则激活它
  5. 模拟某些文字的输入
  6. 我知道有更简单的方法可以实现这一点(例如AutoHotkey),但我觉得使用我自己写的东西并对Python感兴趣时感觉更舒服。
    谢谢!

    为了记录,我在Windows 7 AMD64上使用Python 2.7,但我怀疑解释器版本/平台/架构在这里有很大不同。

1 个答案:

答案 0 :(得分:4)

您是在谈论激活您在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

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