Простой скрипт горячих клавиш в Python - Как установить глобальную горячую клавишу для отправки строки текста? - PullRequest
3 голосов
/ 20 марта 2011

Мне было интересно, как я мог бы использовать wxPython вместе с win32apis для создания простого скрипта, который будет активировать окно (если оно еще не активно) с определенным заголовком и выходным текстом (нажатия клавиш).Одним из возможных приложений для этого могут быть сочетания клавиш в играх.Я прочитал wxPython RegisterHotKey (), но - как программист-любитель Python - мне неясно.
Базовая структура скрипта будет:

  1. Определить горячую клавишу (что-то вроде win + F_)
  2. Следите за нажатием горячей клавиши
  3. Посмотрите, активно ли желаемое окно (заголовок), и активируйте его, если оно не
  4. Имитироватьнабор текста

Я знаю, что для этого есть более простые методы (например, AutoHotkey), но мне удобнее использовать то, что я написал сам и заинтересовался Python.
Спасибо!

Для справки, я использую Python 2.7 на Windows 7 AMD64, хотя я сомневаюсь, что версия / платформа / архитектура интерпретатора имеет здесь большое значение.

1 Ответ

4 голосов
/ 21 марта 2011

Вы говорите об активации окна, которое вы создали в 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. Это гораздо надежнее.

...