前提・実現したいこと
非アクティブウィンドウに対してキーボードとマウス入力を非アクティブのまま行いたいです。
プログラミング言語はC#で書いていますがWin32APIレベルの話になるかと思うのでC++で回答頂いても大丈夫です。
発生している問題・エラーメッセージ
- Test1()
求める結果:メモ帳にはa
と入力されるはず
テスト結果:何も入力されない
- Test2()
求める結果:ペイントに点が描画されるはず
テスト結果:何も描画されない
該当のソースコード
c#
1using System; 2using System.Diagnostics; 3using System.Linq; 4using System.Runtime.InteropServices; 5 6namespace ConsoleApp1 7{ 8 class Program 9 { 10 [DllImport("user32.dll")] 11 public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 12 13 // 送信するメッセージ 14 const uint WM_KEYDOWN = 0x100; 15 const uint WM_LBUTTONDOWN = 0x0201; 16 const uint WM_LBUTTONUP = 0x0202; 17 const uint None = 0; 18 const uint MK_LBUTTON = 0x0001; 19 20 /// <summary> 21 /// メモ帳にaと入力する 22 /// </summary> 23 static void Test1() 24 { 25 // https://www.papy.in/bbs/vc/200609/06090004.html 26 var hwnd = Process.GetProcessesByName("notepad").First().MainWindowHandle; 27 // aと入力 28 PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x41, IntPtr.Zero); 29 } 30 31 /// <summary> 32 /// ペイントでクリックする 33 /// </summary> 34 static void Test2() 35 { 36 // https://social.msdn.microsoft.com/Forums/ja-JP/90258227-a820-4de3-ae71-4bbf88076dd2/wpfc?forum=wpfja 37 var hwnd = Process.GetProcessesByName("mspaint").First().MainWindowHandle; 38 39 UInt16 x = 300; 40 UInt16 y = 300; 41 UInt32 pos = ((UInt32)y << 16) | (UInt32)x; 42 43 // クリックする 44 PostMessage(hwnd, (uint)WM_LBUTTONDOWN, new IntPtr((int)MK_LBUTTON), new IntPtr(pos)); 45 PostMessage(hwnd, (uint)WM_LBUTTONUP, new IntPtr((int)None), new IntPtr(pos)); 46 } 47 48 static void Main(string[] args) 49 { 50 Test1(); 51 Test2(); 52 } 53 } 54} 55
試したこと
- こちらの方法もコピペで試しましたが動作しませんでした。
補足情報(FW/ツールのバージョンなど)
- Windows 10 64bit 1709
