2014-01-23 81 views
2

我在WinForms C#應用程序中有一個函數,它使用一個按鈕將字符串(從文本框)發送到活動的CMD窗口。
不幸的是,如果文本框包含多個零(0000x000F22000),它返回只有一個零:0x0F220我怎樣才能發送一個字符串,有多個零到CMD?

我該如何解決這個問題?

private void but_run_Click(object sender, EventArgs e) 
{ 

     uint wparam = 0 << 29 | 0; 

     int i = 0; 
     for (i = 0; i < textBox1.Text.Length; i++) 
     { 
      //PostMessage(child, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 
      PostMessage(cmdHwnd, WM_CHAR, (int)textBox1.Text[i], 0); 
     } 
     PostMessage(cmdHwnd, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 

} 
+0

你能告訴我們你的代碼嗎? –

+2

你在用'string'混合'int'(或'uint')。以錯誤的方式。顯示實際的代碼。 –

+0

不要將代碼塞進評論人。編輯你的問題,並把它放在那裏。 – Gigi

回答

0

您可以嘗試使用lParam指定重複按鍵。另外,請注意 - PostMessage具有lParam作爲第四個參數(wParamlParam之前),您將其混合在您的代碼中。

接下來,請不要使用(int)someChar。您應該使用Encoding類從字符獲取字節值。

使用SendMessage而不是PostMessage。 PostMessage是異步的,可能會讓很多東西變得複雜。你不需要異步性,所以不要使用它。

接下來,爲什麼要使用WM_CHAR?我會說WM_SETTEXT會更合適 - 您可以一次發送整個文本。只要注意使用本地資源(例如字符串)。爲了使這個儘可能容易,你可以讓自己的SendMessage函數方法的重載:

const uint WM_SETTEXT = 0x000C; 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, unit Msg, 
    IntPtr wParam, string lParam); 

然後,您可以直接電話諮詢:

SendMessage(cmdHwnd, WM_SETTEXT, IntPtr.Zero, textBox1.Text); 
+0

對不起,我找到了另一個解決方案,看起來有點像你的版本(這就是爲什麼我標記了它);不幸的是這改變了我的控制檯窗口的標題。 –

+0

@AndreiPopescu Oooh,我以爲你想輸入文本*到*文本框。如果你想要另一種方式,請使用我的答案的第一部分。 – Luaan

+0

謝謝,我用WM_CHAR來代替PostMessage。 –

0

我已經成功地做到這一點是這樣的:

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
static extern IntPtr FindWindow(IntPtr ZeroOnly, string lpWindowName); 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true)] 
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

const int WM_CHAR = 0x0102; 

public void sendText(string pText, string pCaption) 
    { 
     IntPtr wndHndl = FindWindow(IntPtr.Zero, pCaption); 
     char[] tmpText = pText.ToCharArray(); 
     foreach (char c in tmpText) 
     { 
      System.Threading.Thread.Sleep(50); 
      PostMessage(wndHndl, WM_CHAR, (IntPtr)c, IntPtr.Zero); 
     } 
    } 

pText是輸入字符串和pCaption是窗口的標題。

相關問題