我正在尝试为使用Python的 Windows创build一个简单的开源工具,该工具可以对当前活动窗口的选定文本执行用户定义的操作。 该实用程序应该使用预定义的键盘快捷键来激活。
以下示例部分概述了使用情况:
令我困惑的是第3步 。 如何从活动窗口中检索选定的文本 。 这应该适用于所有的应用程序。
我使用pywin32模块。
在此先感谢您的答案和提示。
更新#1 :
原来有两种方法可以完成这个任务:
作为出发点:
获得活动窗口ID Anurag Uniyal在他的答复指出。
或者用下面的代码获取窗口对象:
import win32ui wnd = win32ui.GetForegroundWindow() print wnd.GetWindowText()
下面的代码将只能在简单的文本框(只是在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()
使用Ctrl-C方法会更好。 直接获取文本可以用于编辑控件,但对于检索应用程序直接在自己的窗口上绘制的文本是无用的。
这不会是微不足道的,但这是一个起点
import win32gui hwnd = win32gui.GetForegroundWindow() print win32gui.GetWindowText(hwnd)
也许你将不得不使用FindWindow
, FindWindowEx
来获得焦点的子窗口
编辑:同时尝试使用spy ++来查看它如何检索有关各种窗口的信息,请参阅hwnd,窗口类等
基本上如果你可以在C / C ++ / C#中找到一个例子,将它翻译成pywin32等效,不会有困难,所以在某种程度上它是win32 api的具体问题