2009-06-17 88 views
12

我正在嘗試使用Python爲窗口創建一個簡單的開源實用程序,它可以對當前活動窗口的選定文本執行用戶定義的操作。該實用程序應該使用預定義的鍵盤快捷鍵進行激活。如何從活動窗口中檢索所選文本

用法是在下面的示例部分中概述:

  1. 用戶使用鼠標或鍵盤(在任何應用程序窗口)
  2. 用戶按下預先定義的鍵盤快捷鍵選擇一些文本
  3. 所選文字由我們的實用程序檢索或複製到剪貼板(兩種方法都應該很好)
  4. 對所選文字執行鍵盤快捷鍵操作

我困惑的是第3步如何從活動窗口檢索選定的文本。這應該適用於所有應用程序。我使用pywin32模塊。

在此先感謝您的答案和提示。

更新#1

原來,有完成任務的兩種方法:

  1. 查找活動窗口,然後將消息發送/按鍵(按Ctrl-C),將它以便將選定的文本複製到剪貼板。然後該實用程序可以通過使用剪貼板相關功能訪問文本來處理文本。
  2. 找到活動的窗口,然後直接檢索選定的文本(不復制到剪貼板)。這似乎比第一種方法更困難。

作爲出發點:

獲取活動窗口ID爲阿努拉格Uniyal指出在他的reply

或者獲得與下面的代碼窗口對象:

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

你能澄清無論此實用程序是否實際上正在創建活動窗口,還是來自不同應用程序的此活動窗口? – 2009-06-17 14:27:39

+0

「活動窗口」是來自不同應用程序的窗口。該實用程序應該在後臺(或系統托盤)中運行,並且應該使用預定義的擊鍵來激活。 – 2009-06-17 14:30:54

+0

你有沒有想過如何檢索選定的文本? – iMath 2015-11-06 04:40:00

回答

1

這不會是微不足道的,但這裏是起點

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

也許你將不得不使用FindWindowFindWindowEx到獲得有焦點的子窗口

編輯:同時嘗試使用spy ++查看它如何檢索有關各種窗口的信息,請參閱HWND,窗口類等

基本上,如果你能找到在C/C++/C#中的例子也不會很難翻譯成pywin32相等的,所以在某種程度上,它是Win32 API的具體問題

+0

我已經得到了積極的窗口對象有以下幾點: 進口win32ui WND = win32ui.GetForegroundWindow() 打印wnd.GetWindowText() 但我從那裏獲得所選文本的困難。感謝您的提示。我會研究間諜++。 – 2009-06-17 15:47:56

1

你使用Ctrl-C方法會好得多。直接獲取文本可用於編輯控件等功能,但對於檢索應用程序直接在自己的窗口上繪製的文本無用。

2

下面的代碼將只在簡單的文本框(只是沒有在VB6,並將其移植到Python)

編輯:它只是對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()