2017-02-18 27 views
0

私は別のアプリケーションの複数の、または特定のテキストボックス/コントロールからテキストを取得しようとしています。複数のテキストボックスからテキストを取得する方法は、別のプログラムを制御します。 C#WM_GETTEXT

ここにあるコードは動作し、label2.textにテキストボックステキストを表示します。

しかし、私が必要とするテキストボックスから値を読み取っていません。すべてのテキストボックスクラス名は "WindowsForms10.EDIT.app.0.141b42a_r12_ad1"です。だから、どのように特定のボックスを読むのですか?

また、アプリケーションが再オープンされるたびにハンドルが変更されます。しかし、クラス名はありません。

解決策がある場合は、サンプルがうまくいくはずです。

おかげ

IntPtr Hwnd = FindWindow(null, "Software - Name"); 

IntPtr Handle = Marshal.AllocHGlobal(100); 

int NumText = (int)SendMessage(Hwnd, WM_GETTEXT, (IntPtr)50, Handle); 


string Text = Marshal.PtrToStringUni(Handle); 
label1.Text = Text; 

IntPtr ChildHandle = FindWindowEx(Hwnd, IntPtr.Zero, "WindowsForms10.EDIT.app.0.141b42a_r12_ad1", ""); 

IntPtr Hndl = Marshal.AllocHGlobal(200); 


       NumText = (int)SendMessage(ChildHandle, WM_GETTEXT, (IntPtr)200, Hndl); 

      Text = Marshal.PtrToStringUni(Hndl); 

        label2.Text = Text; 
+0

これらのウィンドウクラス名は自動生成され、プログラムが実行されるたびに変更されます。だからあなたはヒットしたいテキストボックスを識別するためにそれらを使用することはできません。親からの相対的なボックスの位置は、通常、次善策です。しかし、これをしないで、System.Windowsを使用してください。代わりにオートメーション。 –

答えて

0

は、ほとんどのプログラムではコントロールが常に同じz順序に配置されています。だから、あなたはすべてのテキストボックスをリストし、それらをzオーダーで番号付けし、それを使ってもう一度見つけることができます。

このコードスニペットは、すべてのテキストボックスの内容をlabel2に配置します。ご希望のテキストボックスを持っている数考え出したら

IntPtr Hwnd = FindWindow(null, "Software - Name"); 

IntPtr Handle = Marshal.AllocHGlobal(100); 

int NumText = (int)SendMessage(Hwnd, WM_GETTEXT, (IntPtr)50, Handle); 

string Text = Marshal.PtrToStringUni(Handle); 
label1.Text = Text; 

IntPtr ChildHandle = IntPtr.Zero; 

label2.Text = ""; 

// Loop through all the textboxes that are children of Hwnd. 
int childNo = 0; 
while ((ChildHandle = FindWindowEx(Hwnd, ChildHandle, "WindowsForms10.EDIT.app.0.141b42a_r12_ad1", "")) != IntPtr.Zero) { 
    IntPtr Hndl = Marshal.AllocHGlobal(200); 

    NumText = (int)SendMessage(ChildHandle, WM_GETTEXT, (IntPtr)200, Hndl); 
    Text = Marshal.PtrToStringUni(Hndl); 
    label2.Text += "(Child Number " + childNo + ") " + Text + Environment.NewLine; 
    Marshal.FreeHGlobal(Hndl); 

    childNo++; 
} 

は、あなたはそれだけでそのテキストボックスからテキストを読み込むようにコードを変更することができます。 、数が5である、あなたはこのようなwhileループを変更することができると言う:

while ((ChildHandle = FindWindowEx(Hwnd, ChildHandle, "WindowsForms10.EDIT.app.0.141b42a_r12_ad1", "")) != IntPtr.Zero) { 
    if (childNo == 5) { 
     IntPtr Hndl = Marshal.AllocHGlobal(200); 

     NumText = (int)SendMessage(ChildHandle, WM_GETTEXT, (IntPtr)200, Hndl); 
     Text = Marshal.PtrToStringUni(Hndl); 
     label2.Text = Text; 
     Marshal.FreeHGlobal(Hndl); 
     break; 
    } 

    childNo++; 
} 
0

使用する事は制御IDです。あなたはそれを得るためにSpy ++を使うことができます。

プログラムが実行されている状態で、Visual Studioに移動します。 「ツール」メニューには「Spy ++」があります。お使いのシステムが64ビットシステムの場合は、Spy ++の64ビットバージョンを使用する必要があります.32ビットの場合は、32ビットバージョンを使用する必要があります。 "検索"に移動| "ウィンドウを見つける..."。それは "Find Window"ダイアログを開きます。まず、プログラムが表示されていることを確認します。少なくともそれに関連するボタンの部分。次に、「Finder Tool」アイコン(ターゲットに似た円のある四角形)をクリックします。マウスボタンを押したまま、Finderツールアイコンから「=」ボタンにドラッグしてマウスを放します。ウィンドウの検索ダイアログには、ボタンのハンドルやその他のデータが入力されます。 「OK」をクリックします。 5つのタブを持つタブコントロールを持つ「ウィンドウプロパティ」ウィンドウが表示されます。 5つのタブは、General、Styles、Windows、Class、Processです。最初の(全般)タブの下部にある「コントロールID」を探します。これは16進数の値です。値が何であれ、おそらくそのプログラムを実行するたびにその値になります。 Windows APIレベルでは、コントロールはコントロールIDによって識別されることがよくあります。私たちのプログラムのウィンドウプロパティウィンドウに表示されているコントロールIDを使用することができます。

あなたは次のものが必要です。

「ハンドル」は、メインウィンドウハンドルで、「TextBoxIdは」テキストボックスのIDです、あなたはテキストボックスのハンドルを取得するには、以下を使用することができますと仮定すると
[DllImport("user32.dll")] 
static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem); 

IntPtr TextBoxhWnd = GetDlgItem(handle, TextBoxId); 

また、私のClicking a Button in Another Applicationを参照してください。

+0

プログラムが実行されるたびに制御IDが変更されています – yappy

+0

これは残念です。通常それは起こることはありません。 – user34660

関連する問題