2014-01-23 118 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是窗口的标题。

相关问题