以下是我已經成功地用於這一目的瓦特/我GetLastError函數錯誤檢查刪除/禁用:
[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 *)的文章,但沒有必要。請參閱p/Invoke SendMessage中的第二個C#超載。您可以直接將String或StringBuilder傳遞給SendMessage。
我另外注意到你說你的控件ID是114.你確定WinSpector以10爲基礎給你了那個值嗎?因爲您將它作爲基本10號碼提供給GetDlgItem。我使用的間諜++對於這一點,它在基部16返回控件ID在這種情況下,你可以使用:
IntPtr boxHwnd = GetDlgItem(hWnd, 0x0114);
WinSpector返回基數爲10的數字。我已經用Visual Studio做了一個小測試應用程序,並且這種技術運行正常,但它對於我正在使用的實際應用程序不起作用。 – Kirschstein 2009-07-09 13:51:23