以下是我已经成功地用于这一目的瓦特/我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