使用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);
}
Run Code Online (Sandbox Code Playgroud)
以下是我成功用于此目的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);
}
Run Code Online (Sandbox Code Playgroud)
我已经测试了这段代码,但是如果它失败了,你需要确保使用正确的窗口句柄(对话框本身的句柄)和正确的控件ID.还可以尝试使用记事本中的"查找"对话框进行简单编辑.
我不能在关于使用(char*)的帖子中发表评论但是没有必要.请参阅p/Invoke SendMessage中的第二个C#重载.您可以将String或StringBuilder直接传递给SendMessage.
我另外注意到你说你的控制ID是114.你确定WinSpector给你10基数的价值吗?因为您将它作为基数10提供给GetDlgItem.我为此使用Spy ++,它返回基数为16的控制ID.在这种情况下,您将使用:
IntPtr boxHwnd = GetDlgItem(hWnd, 0x0114);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23664 次 |
| 最近记录: |