2011-05-08 15 views
0

我阅读了许多关于如何发送命令到cmd提示符的答案。使用SendMessage从Windows窗体应用程序发送字符串到命令提示符(cmd)

但我不想使用StreamWriter或类似的东西来输入和获取输出。

我想使用SendMessage发送我的字符串或说命令到cmd提示窗口。

任何人都可以请帮忙吗?

只是为了给我的应用程序的细节。 1.我的应用程序是一个WinForm应用程序。 2.它有4-5个按钮。 3. Button1在Button5关闭或退出命令提示符窗口时打开命令提示符窗口。 4.按钮2,3,4是命令按钮。当用户单击Button2命令时1将被发送到命令提示符窗口。类似的,当点击按钮3和4时,命令2和命令3被发送到相同的命令提示符窗口。

让我知道是否有人有书面的代码发送字符串到命令提示符。

感谢和问候,

拉胡尔

+0

您知道,您可以直接通过使用合适的参数调用cmd.exe(或可执行文件本身)来直接在命令提示符下执行程序。这真的是一种不必要的复杂和迂回的方式来做简单的事情。 – siride 2011-05-08 19:16:05

+2

你听起来很容易确定使用错误的函数来做到这一点。不是一个聪明的方式来提问。 – 2011-05-08 20:33:37

回答

2

我已经得到了解决方案。
我用PostMessage()。
Cmd有句柄,你可以发送字符串给它。
我只是努力寻找正确的方法来获得处理。
现在我得到了一个。

/* 
* Created by SharpDevelop. 
* User: Rahul 
* Date: 5/12/2011 
* Time: 1:49 AM 
* 
* To change this template use Tools | Options | Coding | Edit Standard Headers. 
*/ 
using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Text; 

namespace GetChildWindows 
{ 
/// <summary> 
/// Description of MainForm. 
/// </summary> 
public partial class MainForm : Form 
{ 
    [DllImport("user32")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i); 

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
    IntPtr hWnd = FindWindow(null, "Untitled - Notepad"); 

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


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

    const int WM_KEYDOWN = 0x0100; 
    const int WM_KEYUP = 0x0101; 
    const int WM_CHAR = 0x0102; 

    public static IntPtr cmdHwnd = IntPtr.Zero; 

    public MainForm() 
    { 
     // 
     // The InitializeComponent() call is required for Windows Forms designer support. 
     // 
     InitializeComponent(); 

     // 
     // TODO: Add constructor code after the InitializeComponent() call. 
     // 

     foreach (IntPtr child in GetChildWindows(FindWindow(null, "WinPlusConsole"))) 
     { 
      StringBuilder sb = new StringBuilder(100); 
      GetClassName(child, sb, sb.Capacity); 


      if (sb.ToString() == "ConsoleWindowClass") 
      { 
//     uint wparam = 0 << 29 | 0; 
//     string msg = "Hello"; 
//     int i = 0; 
//     for (i = 0 ; i < msg.Length ; i++) 
//     { 
//      //PostMessage(child, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 
//      PostMessage(child, WM_CHAR, (int)msg[i], 0); 
//     } 
//     PostMessage(child, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 

       cmdHwnd = child; 
      } 
     } 

} 

/// <summary> 
    /// Returns a list of child windows 
    /// </summary> 
    /// <param name="parent">Parent of the windows to return</param> 
    /// <returns>List of child windows</returns> 
    public static List<IntPtr> GetChildWindows(IntPtr parent) 
    { 
     List<IntPtr> result = new List<IntPtr>(); 
     GCHandle listHandle = GCHandle.Alloc(result); 
     try 
     { 
      EnumWindowProc childProc = new EnumWindowProc(EnumWindow); 
      EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); 
     } 
     finally 
     { 
      if (listHandle.IsAllocated) 
      listHandle.Free(); 
     } 
     return result; 
    } 

    /// <summary> 
    /// Callback method to be used when enumerating windows. 
    /// </summary> 
    /// <param name="handle">Handle of the next window</param> 
    /// <param name="pointer">Pointer to a GCHandle that holds a reference to the list to fill</param> 
    /// <returns>True to continue the enumeration, false to bail</returns> 

    private static bool EnumWindow(IntPtr handle, IntPtr pointer) 
    { 
     GCHandle gch = GCHandle.FromIntPtr(pointer); 
     List<IntPtr> list = gch.Target as List<IntPtr>; 
     if (list == null) 
     { 
      throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>"); 
     } 
     list.Add(handle); 
     // You can modify this to check to see if you want to cancel the operation, then return a null here 
     return true; 
    } 

    /// <summary> 
    /// Delegate for the EnumChildWindows method 
    /// </summary> 
    /// <param name="hWnd">Window handle</param> 
    /// <param name="parameter">Caller-defined variable; we use it for a pointer to our list</param> 
    /// <returns>True to continue enumerating, false to bail.</returns> 
    public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter); 





    void BtnHelloClick(object sender, EventArgs e) 
    { 
     uint wparam = 0 << 29 | 0; 
       string msg = "Hello"; 
       int i = 0; 
       for (i = 0 ; i < msg.Length ; i++) 
       { 
        //PostMessage(child, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 
        PostMessage(cmdHwnd, WM_CHAR, (int)msg[i], 0); 
       } 
       PostMessage(cmdHwnd, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 
    } 

    void BtnCommandClick(object sender, EventArgs e) 
    { 
     uint wparam = 0 << 29 | 0; 
       string msg = textBox1.Text; 
       int i = 0; 
       for (i = 0 ; i < msg.Length ; i++) 
       { 
        //PostMessage(child, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 
        PostMessage(cmdHwnd, WM_CHAR, (int)msg[i], 0); 
       } 
       PostMessage(cmdHwnd, WM_KEYDOWN, (IntPtr)Keys.Enter, (IntPtr)wparam); 
    } 

    void TextBox1TextChanged(object sender, EventArgs e) 
    { 

    } 
} 
} 


感谢所有!

0

它不清楚从explenation(至少不是我)为什么你不能在你所描述的场景中使用的StreamWriter。你能详细说明一下吗?

我会检查出Process类通过标准输入/输出谈论其他程序

1

这似乎不太可能,你将能够与SendMessage()来实现这一目标。 SendMessage()需要窗口句柄,我不认为cmd.exe有一个合适的窗口句柄来接收消息。

我的建议是寻找一种方法来解决您的问题,而不是决定您想要什么解决方案并尝试使其适合问题。

+0

SendMessage不起作用,但是PostMessage会这样做,所以cmd.exe的确有一个合适的窗口句柄来接收消息。 – ThreeStarProgrammer57 2018-02-07 10:57:12

相关问题