キーストロークを1つの汎用ウィンドウに送信するC++コンソールアプリケーションがあります。 メッセージキュー(入力用)をすべて開いて、EnumWindows()
そして、私のコールバックストアに関するいくつかの情報、それはGetWindowText()
、GetWindowThreadProcessId()
とPostThreadMessage()
を持っている(メッセージキューを持っている場合WM_NULL
メッセージで、チェックするため)ともそのHWND hWnd
... [以下のコード]SendInputを使用してキーストロークを送信する
ヒント:はこれです正しいか使用する必要がありますEnumChildWindows()
?これを行うための最善の方法である:
は、私は窓の1 ...
ヒントになどの例ALT+F4
またはCTRL+T
のためにキーストロークを送りたい...
を続けます? SendInput()
またはPostThreadMessage()
?
[HALF自動返信]:で、私は現在、たとえばため、myVKey = MapVirtualKeyEx(..., MAPVK_VSC_TO_VK, ...)
でVirtualKeyでスキャンコードの変換を使用してINPUT
のグループを送信し、SendInput()
をしようとしているとF4
が56
あると62
int
などのタイプHEX
は38
と3E
...入力をdwFlags = 0
で行い、その後は逆順でdwFlags = KEYEVENTF_KEYUP
と入力します(コマンドグループのみを処理する必要があります。 (?右)
私はVKEYハードウェアスキャンコードよりも優れていると思う
3番目の質問:SendInput()
を使用する前に、どのように私は窓を持っていけばいいですか? ましょう...私は、ウィンドウに関するすべての情報を持っている
私が使用しなければならない何と順にSetFocus()
、SetActiveWindow()
および/またはSetForegroundWindow()
を想定? 【全てがコメントされている]
コードのビット:
bool _res = false;
_res = AttachThreadInput(GetCurrentThreadId(), targetThreadID, TRUE);
if (!_res) {
cout << "Error: " << GetLastError() << endl;
}
else {
//SetFocus(focusHandler);
//SetActiveWindow(focusHandler);
//SetForegroundWindow(focusHandler);
enter code here
if (!prevH) {
cout << "Error: " << GetLastError() << endl;
}
else {
UINT res = SendInput(nTotVKey, numInputVect, sizeof(INPUT));
if (res != nTotVKey) {
cout << "Error: " << GetLastError() << endl;
}
else {
_res = AttachThreadInput(GetCurrentThreadId(), targetThreadID, FALSE);
if (!_res) {
cout << "Error: " << GetLastError() << endl;
}
}
}
任意の助けが理解されるであろう。おかげで..
EDIT:REAL SCENARIOは、クライアントが「私が選択したウィンドウにCTRL + Wをやる」と言うているC/Sアプリケーションであり、サーバ「CTRL + Wに送るC#クライアントを想像してみて"サーバーがスレッド入力キューに送信する必要があるGoogle Chromeのメッセージ(例)..." CTRL + W "の入力を送信するためにforegound" Google Chrome "を配置する必要があります..どんな競争も心配しないでください条件などを入力します。必要に応じて、クライアントは再度コマンドを送信します。
1つにつき1つの質問をお願いします! –
あなたは正しいですが、最初の2つは最終的な質問に関連しています。 –
メッセージキューを持つスレッドがウィンドウを所有しているかどうかを調べるために、 'PostMessage'を調べる必要はありません。ウィンドウを所有するスレッドにはメッセージキューがあります。実際、USER32 APIを呼び出したスレッドにはメッセージキューがあります。特定のウィンドウに入力を送信する場合、唯一信頼性が高くサポートされている方法は[UI Automation](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)です。他のすべてのもの( 'AttachThreadInput'であなたのハックを含む)は、いずれかの方法で失敗します。 – IInspectable