次は私が無効/削除チェック私の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);
WinSpectorは10進数を返します。私はVisual Studioで少しテストアプリケーションを作ってきましたが、このテクニックはうまくいきますが、実際のアプリケーションでは動作しません。 – Kirschstein
実際のアプリケーションでコードをステップ実行すると、GetDlgItem()はゼロ以外の値を返しますか? – Gregyski
はい、そうですが、WM_GETTEXTを使用して既存のテキストを取得できます。それは機能していないWM_SETTEXTだけです。 – Kirschstein