29572


タイトルの通りC#で非アクティブのプロセスへキー入力する方法はありますか？  
非アクティブのプロセスをアクティブにしないとできないのでしょうか？？


CC BY-SA 3.0
2016-10-14T15:08:39.657
29568
2016-10-15T00:36:22.827
19001
question
c#
C#にて非アクティブのプロセスへキー入力したい


相手先プロセスの実装にもよりますが、[`WM_KEYDOWN`](https://msdn.microsoft.com/en-
us/library/windows/desktop/ms646280\(v=vs.85\).aspx)などのメッセージを[`PostMessage`](https://msdn.microsoft.com/en-
us/library/windows/desktop/ms644944\(v=vs.85\).aspx)などのAPIを用いて対象ウィンドウに送信すればよいのではないでしょうか。

[code]

    class Program
    {
        // イベントを送信するためのWin32 API
        [DllImport("user32.dll")]
        public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
        // 送信するメッセージ
        const uint WM_KEYDOWN = 0x100;
    
        static void Main(string[] args)
        {
            if (args.Length == 1)
            {
                // 送信側プロセス
    
                var pid = int.Parse(args[0]);
                Console.WriteLine("Parent PID:{0}", pid);
    
                // TODO:対象アプリケーションに合わせた形でキーの送信対象のウィンドウハンドルを探す
                var hwnd = Process.GetProcessById(pid).MainWindowHandle;
    
                for (;;)
                {
                    // 現在のプロセスに入力されたアルファベットをそのまま送信する
    
                    var k = Console.ReadKey();
    
                    if (char.IsLetter(k.KeyChar))
                    {
                        // 対象ウィンドウにキーダウンメッセージを送信する
                        PostMessage(hwnd, WM_KEYDOWN, (IntPtr)k.Key, IntPtr.Zero);
                    }
                    else
                    {
                        break;
                    }
                }
    
                // 終了待機
                Console.WriteLine("Hit any key to Exit");
                Console.ReadKey();
            }
            else
            {
                // 受信側プロセス
    
                // 送信側プロセスを起動する
                Console.WriteLine("Launching Child Process...");
                var p = Process.Start(
                           typeof(Program).Assembly.GetName().Name
                         , Process.GetCurrentProcess().Id.ToString());
                Console.WriteLine("Child PID:{0}", p.Id);
    
                // 終了待機
                Console.WriteLine("Hit Enter to Exit...");
                Console.ReadLine();
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2016-10-15T00:36:22.827
29572
2016-10-15T00:36:22.827
5750
29568
answer