別プロセス(メモ帳)にキーボードメッセージを送っているのですが
PostMessage(hWnd, WM_KEYDOWN, 0x41, 0x1E0001);//a
PostMessage(hWnd, WM_KEYUP, 0x41, 0xC01E0001);//a
SetForegroundWindow(hWnd);
Sleep(250);
PostMessage(hWnd, WM_KEYDOWN, 0x0D, 0x1C0001);//Enter
PostMessage(hWnd, WM_KEYUP, 0x0D, 0xC01C0001);//Enter
というように一度アクティブにすると正常に
[a],[Enter]
と入力してくれますが、
PostMessage(hWnd, WM_KEYDOWN, 0x41, 0x1E0001);//a
PostMessage(hWnd, WM_KEYUP, 0x41, 0xC01E0001);//a
//SetForegroundWindow(hWnd);
Sleep(250);
PostMessage(hWnd, WM_KEYDOWN, 0x0D, 0x1C0001);//Enter
PostMessage(hWnd, WM_KEYUP, 0x0D, 0xC01C0001);//Enter
のように非アクティブのままだと
[a]
で止ってしまいます。
[Enter]が[Esc]等でも同じ結果になってしまいます。
PostMessageの戻り値はすべて1が返ってきてspy++等で確認しても
メッセージは送信されているようです。
”非アクティブウィンドウ”には[Enter]等は送信できないのでしょうか?
方法があれば教えてください。宜しくお願いします。
想像ですが、単にメモ帳が「非アクティブ時はキー入力を受け付けない」という仕様になっているだけの可能性があります。というかそうじゃないと、アクティブなEXCELに入力した文字が裏のメモ帳にも入ってしまって困ったことになります。あくまで想像ですが。
時間があるなら「非アクティブ時もキー入力を受け付けつける簡単なアプリ」を自作して試して見ると良いかと。
>アクティブなEXCELに入力した文字が裏のメモ帳にも入ってしまって困ったことになります
それぞれのプロセスのハンドルを指定してメッセージを送信してるのでそういう風にはならないですよね。
やっぱり受け側のプロセスが非アクティブの時に[Enter]とかのメッセージを受け取る許可をしていないとだめなのかな?
>アクティブなEXCELに入力した文字が裏のメモ帳にも入って
これはユーザーのキー操作をOSが各アプリに配信することを差していますので、あなたのアプリの
>それぞれのプロセスのハンドルを指定してメッセージを送信
とは別の話です。
>メッセージを受け取る許可をしていないとだめなのかな
はい、私が言いたかったのはまさしくこれです。
上の返答じゃあまり役にたたんと思うので補足しとくと、
>メッセージを受け取る許可をしていないとだめなのかな
と思っててさらに調べたいのなら、確かメモ帳はSDIのサンプルアプリケーションとしてMSDNにソース付きで収録されていたはず。それを見れば一応解決する可能性はあるかと(でもMFCの中にまで入って行かないと駄目かな?)。
ただ5年以上前の知識なので、今のMSDNには入ってないかも。
// ここでメモ帳のウィンドウハンドル指定
::SetFocus(hwnd);
// 仮想キーコードを指定して押し下げ通知(必ず最後は離します)
::keybd_event( VK_A, 0, 0, 0 );
::keybd_event( VK_A, 0, KEYEVENTF_KEYUP, 0 );
のような感じでどうでしょう?
つい最近似たような質問があったようで
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200607/06070028.txt
こちらの方が回答されている内容も参考になるかも