2009-07-08 20 views
4

Winspectorを使用する変更したい子テキストボックスのIDが114であることがわかりました。なぜこのコードはTextBoxのテキストを変更していませんか?外部アプリのテキストボックスのテキストを設定します。 Win32 API

[DllImport("user32.dll")] 
    static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); 
    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int msg, int Param, string s); 

    const int WM_SETTEXT = 0x000c; 

    private void SetTextt(IntPtr hWnd, string text) 
    { 
     IntPtr boxHwnd = GetDlgItem(hWnd, 114); 
     SendMessage(boxHwnd, WM_SETTEXT, 0, text); 
    } 

答えて

7

次は私が無効/削除チェック私のGetLastErrorエラー/ wは、その目的のために首尾よく使用されてきたものである:

[DllImport("user32.dll", SetLastError = false)] 
public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
public static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, string lParam); 
public const uint WM_SETTEXT = 0x000C; 

private void InteropSetText(IntPtr iptrHWndDialog, int iControlID, string strTextToSet) 
{ 
    IntPtr iptrHWndControl = GetDlgItem(iptrHWndDialog, iControlID); 
    HandleRef hrefHWndTarget = new HandleRef(null, iptrHWndControl); 
    SendMessage(hrefHWndTarget, WM_SETTEXT, IntPtr.Zero, strTextToSet); 
} 

私はこのコードをテストしてみたし、それが動作しますので、それが失敗した場合あなたには、正しいウィンドウハンドル(ダイアログボックス自体のハンドル)と正しいコントロールIDを使用していることを確認する必要があります。また、メモ帳で[検索]ダイアログを編集するなどの簡単な操作を試してみてください。

(char *)の使用に関してはまだコメントできませんが、必ずしも必要ではありません。 2番目のC#オーバーロードはp/Invoke SendMessageを参照してください。 StringまたはStringBuilderをSendMessageに直接渡すことができます。

さらに、コントロールIDが114であると言います.WinSpectorが10進数でその値を与えたことは確かですか?あなたはベース10の数字としてGetDlgItemにそれを供給しているからです。私はこれにSpy ++を使用し、ベース16に制御IDを返します。その場合、次のように使用します:

IntPtr boxHwnd = GetDlgItem(hWnd, 0x0114); 
+0

WinSpectorは10進数を返します。私はVisual Studioで少しテストアプリケーションを作ってきましたが、このテクニックはうまくいきますが、実際のアプリケーションでは動作しません。 – Kirschstein

+0

実際のアプリケーションでコードをステップ実行すると、GetDlgItem()はゼロ以外の値を返しますか? – Gregyski

+1

はい、そうですが、WM_GETTEXTを使用して既存のテキストを取得できます。それは機能していないWM_SETTEXTだけです。 – Kirschstein

0

本当にテキストを渡していますか? SendMessage last paramは、設定したいテキストを含むchar *へのポインタでなければなりません。
How to get selected cells from TDBGrid in Delphi 5
内のテキストを設定する私の「粗ハック」を見これは別名* PChar型がcharであるデルファイ5、で行われ、私は単にint型(Delphiでの整数)として、それをキャストしています。

0

「テキスト」が外部アプリのメモリ空間に割り当てられていることを確認する必要があります。呼び出し元のアプリケーションにテキストを割り当てて別のアプリに渡すことはできません。それぞれのアプリケーションに専用のメモリ空間が割り当てられます。

0

10進数にHexdecimalナンバーから(++スパイから得た)あなたのコントロールIDを変換し、テキストbox.Thisのハンドルを取得します
これは私のために働いたGetDlgItem function.Withにその値を渡してください。

[DllImport("user32.dll")] 
static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); 
[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int msg, int Param, string s); 

const int WM_SETTEXT = 0x000c; 

private void SetTextt(IntPtr hWnd, string text) 
{ 
    IntPtr boxHwnd = GetDlgItem(hWnd, 114); 
    SendMessage(boxHwnd, WM_SETTEXT, 0, text); 
} 
関連する問題