2009-07-08 52 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); 
} 
相關問題