2017-03-24 8 views
0

隠しCMDウィンドウに文字キーを送信するには? マイコード:どのようにキーを送信する隠されたCMDプロセスを開始

[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

public void SendText(IntPtr hwnd, string keys) 
{ 
    if (hwnd != IntPtr.Zero) 
    { 
     if (SetForegroundWindow(hwnd)) 
     { 
      System.Windows.Forms.SendKeys.Send(keys); 
     } 
    } 
} 

Process p; 
int pid; 

スタート隠しプロセス:

private void button1_Click(object sender, EventArgs e) 
{ 
    p = new Process(); 
    p.StartInfo.FileName = "cmd.exe"; 
    p.StartInfo.UseShellExecute = true; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    p.Start(); 
    pid = p.Id; 
} 

が送信キー:

private void button4_Click(object sender, EventArgs e) 
{ 
    var proc1 = Process.GetProcessById(pid); 
    SetForegroundWindow(proc1.Handle); 
    SendKeys.Send("q"); 
} 

キー私のプロセスを送信するためにどのように? (しかし、私のコードffmpeg.exeを開始し、 "q"キーを停止エンコードを送信します) ありがとう答え。

+0

正確に何をしたいですか?キープレスを送信するには?またはプロセスを停止するには?後者の場合、プロセスオブジェクトを使用してffmpegを直接呼び出し、同じオブジェクトを使用して停止することができます。 – Sidewinder94

+0

キー「q」を送信してffmpegを停止します。プロセスを殺さない。 – Gabee

答えて

0

ProcessWindowStyle.MinimizedまたはProcessWindowStyle.Normalで同じ問題が発生していますが、正常に動作します。しかし、ProcessWindowStyle.Hiddenでそれを行う方法がないので、それは思われます。

0

非アクティブなウィンドウにキーを送信することはできません。非アクティブなウィンドウはアクティブにできません。

回避方法:代わりにウィンドウスタイルを非表示にします。最小化することはできますが、キーを送信するためにはそれをアクティブにする必要があるため、実行中のすべてのプロセスをループして最小化されたウィンドウを見つけ出し、アクティブにしてからキーを送信し、再度最小化します(フォアグラウンド)。メインに

場所コードのこの部分を:ここ

[DllImport("user32.dll")] 
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); 

[DllImport("user32.dll", EntryPoint = "FindWindow")] 
private static extern IntPtr FindWindow(string lp1, string lp2); 

[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool SetForegroundWindow(IntPtr hWnd); 

はあなた(P)プロセスのために準備された方法であって、Qを送信するために、例えば

public void sendkeys(string data) 
{ 
    send = true; 
    Process s = Process.GetProcessById(p.Id); 
    while (s.ProcessName == p.ProcessName && send) 
    { 
     while (send) 
     { 
      IntPtr h = s.MainWindowHandle; 
      SetForegroundWindow(h); 
      SendKeys.SendWait(data); 
      Thread.Sleep(1000); 
      send = false; 
     } 
    } 
} 

>>>sendKeys("q")

関連する問題