外部应用程序中文本框的SetText。 Win32 API

使用Winspector我发现我要更改的子文本框的ID是114.为什么这段代码不能更改TextBox的文本?

[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); } 

以下是我成功用于此目的w /我的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 *)的post中发表评论但是没有必要。 请参阅p / Invoke SendMessage中的第二个C#重载。 您可以将String或StringBuilder直接传递给SendMessage。

我另外注意到你说你的控制ID是114.你确定WinSpector给你10基数的值吗? 因为您将它作为基数10提供给GetDlgItem。 我为此使用Spy ++并返回基数为16的控制ID。在这种情况下,您将使用:

 IntPtr boxHwnd = GetDlgItem(hWnd, 0x0114); 

请将您的控件ID(从间谍++获取)从hex数转换为十进制数,并将该值传递给GetDlgItem函数。具有此function
你将获得文本框的句柄。这对我有用。

 [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); } 

你确定你正在传递文字吗? SendMessage last param应该是指向包含要设置的文本的char *的指针。
看看如何在Delphi 5中从TDBGrid获取选定单元格中设置文本的“粗略黑客”
这是在Delphi 5中完成的,其中PChar是char *别名,我只是将其转换为int(Delphi中的Integer)。

您必须确保在外部应用程序的内存空间中分配“text”。 您将无法在调用者应用程序中分配文本并将其传递给另一个应用程序,因为每个应用程序都有自己的专用内存空间。