Как извлечь выделенный текст из активного окна

Я пытаюсь создать простую утилиту с открытым исходным кодом для Windows с помощью Python, которая может выполнять пользовательские действия над выбранным текстом текущего активного окна. Утилита должна быть активирована с использованием заранее заданного сочетания клавиш.

Использование частично описано в следующем примере:

  1. Пользователь выбирает текст с помощью мыши или клавиатуры (в любом окне приложения)
  2. Пользователь нажимает заранее установленную комбинацию клавиш
  3. Выбранный текст извлекается нашей утилитой или копируется в буфер обмена (оба подхода должны быть точными)
  4. Зависимое от клавиатуры действие выполняется по выбранному тексту

Меня озадачивает шаг 3 . Как выбранный текст извлекается из активного окна . Это должно работать со всеми приложениями.

Я использую модуль pywin32 .

Заранее благодарим за ваши ответы и советы.

Обновление # 1 :

Оказывается, есть два подхода к выполнению задачи:

  1. Найдите активное окно, затем отправьте ему сообщение / нажатие клавиши (Ctrl-C), чтобы скопировать выделенный текст в буфер обмена. Затем утилита может работать над текстом, обратившись к нему, используя связанные с буфером функции.
  2. Найдите активное окно, затем извлеките выделенный текст напрямую (без копирования его в буфер обмена). Это кажется более сложным, чем первый подход.

В качестве отправной точки:

Получить идентификатор активного окна, как указал Анураг Юниял в своем ответе .

Или получить объект окна со следующим кодом:

import win32ui
wnd = win32ui.GetForegroundWindow()
print wnd.GetWindowText()

python,windows,winapi,pywin32,

13

Ответов: 3


2

приведенный ниже код будет работать только в простых текстовых блоках (только что сделал это в VB6 и портирован на python)

edit: он был протестирован только на python 2.6

from ctypes import *
import win32gui
import win32api
import win32con


user32 = windll.user32
kernel32 = windll.kernel32

class RECT(Structure):
 _fields_ = [
     ("left", c_ulong),
     ("top", c_ulong),
     ("right", c_ulong),
     ("bottom", c_ulong)
 ]

class GUITHREADINFO(Structure):
 _fields_ = [
     ("cbSize", c_ulong),
     ("flags", c_ulong),
     ("hwndActive", c_ulong),
     ("hwndFocus", c_ulong),
     ("hwndCapture", c_ulong),
     ("hwndMenuOwner", c_ulong),
     ("hwndMoveSize", c_ulong),
     ("hwndCaret", c_ulong),
     ("rcCaret", RECT)
 ]



def get_selected_text_from_front_window(): # As String
    ''' vb6 to python translation '''

    gui = GUITHREADINFO(cbSize=sizeof(GUITHREADINFO))
    txt=''
    ast_Clipboard_Obj=None
    Last_Clipboard_Temp = -1


    user32.GetGUIThreadInfo(0, byref(gui))

    txt = GetCaretWindowText(gui.hwndCaret, True)

    '''
    if Txt = "" Then
        LastClipboardClip = ""
        Last_Clipboard_Obj = GetClipboard
        Last_Clipboard_Temp = LastClipboardFormat
        SendKeys "^(c)"
        GetClipboard
        Txt = LastClipboardClip
        if LastClipboardClip <> "" Then Txt = LastClipboardClip
        RestoreClipboard Last_Clipboard_Obj, Last_Clipboard_Temp
        print "clbrd: " + Txt
    End If
    '''    
    return txt



def GetCaretWindowText(hWndCaret, Selected = False): # As String

    startpos =0
    endpos =0

    txt = ""

    if hWndCaret:

        buf_size = 1 + win32gui.SendMessage(hWndCaret, win32con.WM_GETTEXTLENGTH, 0, 0)
        if buf_size:
            buffer = win32gui.PyMakeBuffer(buf_size)
            win32gui.SendMessage(hWndCaret, win32con.WM_GETTEXT, buf_size, buffer)
            txt = buffer[:buf_size]

        if Selected and buf_size:
            selinfo  = win32gui.SendMessage(hWndCaret, win32con.EM_GETSEL, 0, 0)
            endpos   = win32api.HIWORD(selinfo)
            startpos = win32api.LOWORD(selinfo)
            return txt[startpos: endpos]

    return txt

if __name__ == '__main__':
    print get_selected_text_from_front_window()

1

Вам намного лучше использовать метод Ctrl-C. Извлечение текста напрямую будет работать для чего-то вроде элемента управления редактирования, но бесполезно для получения текста, который приложение нарисовало непосредственно в собственном окне.


1

Это не будет тривиально, но вот отправная точка

import win32gui
hwnd = win32gui.GetForegroundWindow()
print win32gui.GetWindowText(hwnd)

Возможно, вам придется использовать FindWindow, FindWindowExчтобы получить дочерние окна с фокусом

edit: также при экспериментировании используйте spy ++, чтобы узнать, как он извлекает информацию о различных окнах, см. hwnd, класс окна и т. д.

в принципе, если вы можете найти пример в C / C ++ / C #, это не составит труда перевести это в эквивалент pywin32, поэтому в некотором смысле это особый вопрос win32 api

питон, окна, WinAPI, pywin32,
Похожие вопросы
Яндекс.Метрика