2009-07-08 54 views
4

使用Winspector我已经找到了我想要改变的子文本框的ID是114.为什么这段代码不能改变TextBox的文本?外部应用程序中的文本框的SetText。 Win32 API

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

回答

7

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

WinSpector返回基数为10的数字。我已经用Visual Studio做了一个小测试应用程序,并且这种技术运行正常,但它对于我正在使用的实际应用程序不起作用。 – Kirschstein 2009-07-09 13:51:23

0

你确定你逝去的文字吗? SendMessage的最后一个参数应该是一个指向char *的指针,包含你想要设置的文本。
看看设置文本的我“黑客原油”在 How to get selected cells from TDBGrid in Delphi 5
这是在Delphi 5中,其中PChar类型是char *别名做的,我只是将它转换为INT(在Delphi整数)。

0

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

0

请将从Hexdecimal数到十进制数的控制ID(从谍++获得)和值传递给函数GetDlgItem function.With这
你会得到文本box.This的手柄为我工作。

[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); 
} 
相关问题