2009-06-17 12 views
12

Pythonを使って、現在アクティブなウィンドウの選択されたテキストに対してユーザー定義のアクションを実行できる単純なオープンソースユーティリティを作成しようとしています。このユーティリティは、あらかじめ定義されたキーボードショートカットを使用してアクティブにする必要があります。アクティブなウィンドウから選択したテキストを取り出す方法

使用は、部分的に以下の実施例に概説する:

  1. ユーザが
  2. (任意のアプリケーションウィンドウで)マウスまたはキーボードを使用してテキストを選択し、ユーザーが事前に定義されたキーボードショートカット
  3. を押下します
  4. 選択したテキストが当社のユーティリティで取り出されるか、クリップボードにコピーされます(どちらの方法も問題ありません)
  5. キーボードショートカットに依存する操作が選択されたテキストに対して実行されます

私が困惑しているのは、ステップ3です。 選択したテキストをアクティブなウィンドウから取得する方法。これはすべてのアプリケーションで有効です。

pywin32モジュールを使用します。

ご回答いただきありがとうございます。

更新#1:それへのメッセージ/キーストローク(Ctrl + Cキー)を送信し、アクティブなウィンドウを探す

  1. は、タスクを達成するために2つのアプローチがあることが判明選択したテキストをクリップボードにコピーします。次に、ユーティリティは、クリップボード関連の関数を使用してテキストにアクセスすることにより、テキストに対して作業を行うことができます。

  2. アクティブなウィンドウを見つけて、選択したテキストを直接(クリップボードにコピーせずに)取得します。これは第1のアプローチよりも難しいようです。出発点として

アヌラーグUniyalが彼のreplyで指摘したように、アクティブなウィンドウのIDを取得します。

または、次のコードでウィンドウオブジェクトを取得します:

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

上でテストされましたを明確にすることができこのユーティリティが実際にアクティブなウィンドウを作成しているかどうか、あるいは別のアプリケーションからこのアクティブなウィンドウですか? –

+0

「アクティブなウィンドウ」は、別のアプリケーションのウィンドウです。このユーティリティは、バックグラウンド(またはシステムトレイ)で実行する必要があり、あらかじめ定義されたキーストロークでアクティブ化する必要があります。 –

+0

選択したテキストの取得方法を理解しましたか? – iMath

答えて

1

それは些細なことではないだろうが、ここでは、出発点は

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

ですたぶん、あなたはFindWindowを使用する必要があります、FindWindowExへフォーカスのある子ウィンドウを取得する

編集:また、spy ++を使って様々なウィンドウについての情報を取得する方法を見てみましょう。 HWND、ウィンドウクラスなど

あなたはC/C++/C#で例を見つけることができれば、基本的には、pywin32と同等にそのを翻訳することは困難ではありません、方法では、Win32 APIの具体的な質問

+0

私は次のようにアクティブウィンドウオブジェクトを取得してきた: インポートwin32ui WND = win32ui.GetForegroundWindow() プリントwnd.GetWindowText() しかし、私はそこから選択したテキストに得ることに困難を抱えています。ヒントをありがとう。私はスパイ+ +を見ていきます。 –

1

あるので、あなたCtrl + Cメソッドを使用する方がずっと優れています。テキストを直接取得することは、エディットコントロールのようなものでは機能しますが、アプリケーションが独自のウィンドウに直接ペイントしたテキストを取得するためには役に立ちません。

+0

ありがとうございます。これは、テキスト選択をサポートするすべてのアプリケーションがクリップボードを使用することを前提としています。これは99.99%のアプリケーションでは当てはまりますが、これがルールであるかどうかは分かりますか? –

+0

テキストのクリップボードコピーをサポートするアプリケーションはいくつかありますが、Ctrl + Cでは「クリップボードコピー」とは異なる意味が割り当てられます。たとえば、コマンドシェル(cmd.exe)があります。 –

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() 
+0

Python 3でコードをテストしましたが、、テキストは返されません。 – iMath

関連する問題