何時も、お世話に成っています。
目的ウィンドウに送信後、フォーカスを変更したいのですが、
SendInputの後にSetFocus等で変更したウィンドウに送信されるのですが、
度の様にすれば良いのでしょうか?
下記の場合、EditBox2に送信される。
SetFocus(EditBox1)
SendInput()
SetFocus(EditBox2)
p.s.
keybd_event 関数
「Windows NT/2000/XP: この関数は SendInput 関数に取って代わられました。」
となっていますが、不具合が生じるのでしょうか?
宜しくお願いします。
SendInput でアクティブウィンドウに送信
Re: SendInput でアクティブウィンドウに送信
SendInput()の後にSleep()を50~100ミリ秒くらい入れてみてはどうでしょうか?> 何時も、お世話に成っています。
>
> 目的ウィンドウに送信後、フォーカスを変更したいのですが、
> SendInputの後にSetFocus等で変更したウィンドウに送信されるのですが、
> 度の様にすれば良いのでしょうか?
>
> 下記の場合、EditBox2に送信される。
> SetFocus(EditBox1)
> SendInput()
> SetFocus(EditBox2)
EditBoxに文字を打ち込むだけならSetWindowTextでもよさそうですが。。。
keybd_event()とSendInput()との大きな違いはkeybd_event()がキーイベントを1つ1つ個別に送信するのに対し、> p.s.
> keybd_event 関数
> 「Windows NT/2000/XP: この関数は SendInput 関数に取って代わられました。」
> となっていますが、不具合が生じるのでしょうか?
SendInput()はキーやマウスのイベントをブロック単位で送信するというものです。
keybd_event()はキーイベントの送信中に、人間がキーを操作してしまうとそのキーイベントが紛れ込んでしまいます。
(もちろんkeybd_event()を使用する別のアプリケーションからも影響を受けます。)
一方のSendInputを使用すると、キーイベントをブロック単位で発生させますので、割り込みの影響を受けにくいです。
どちらを使うかは自由ですが、keybd_event()はMicrosoftは推奨していません。
今後サポートを打ち切られる可能性もあります。
(サポートしないといいながら16bit時代のガラクタがWindowsXPには大量に搭載されてます。Vistaで大分整理されたみたいだが...)
一応、ActiveBasicでは環境依存(9X系のWindowsは98以降にSendInputは実装されている)の強いAPIは搭載しない方針できていたので
SendInput関数は標準には入りにくかったとは思うんですが、
おそらく、SendInput関数のINPUT構造体は共用体を含むので入ってないのではないかと思います。
P.S.
さすがに今、10年前のOSである95は考えなくてもいいと思うので、
今後はSendInput関数を使う方向でいいんじゃないですかね。
SendInput でアクティブウィンドウに送信
NoWest様、何時も ありがとう御座います。
でも、この問題が解決しないと使い辛いですね。
宜しくお願いします。
カーソルが指定時間表示するだけでSendInput後に変更したウィンドウに送信されます。SendInput()の後にSleep()を50~100ミリ秒くらい入れてみてはどうでしょうか?
その通りで、拡張キーなど併用しています。EditBoxに文字を打ち込むだけならSetWindowTextでもよさそうですが。。。
ありがとう、そうします。どちらを使うかは自由ですが、keybd_event()はMicrosoftは推奨していません。
今後サポートを打ち切られる可能性もあります。
P.S.
さすがに今、10年前のOSである95は考えなくてもいいと思うので、
今後はSendInput関数を使う方向でいいんじゃないですかね。
でも、この問題が解決しないと使い辛いですね。
宜しくお願いします。
Re: SendInput でアクティブウィンドウに送信
> カーソルが指定時間表示するだけでSendInput後に変更したウィンドウに送信されます。
以前、どっかのスレッドで紹介したコードなんですが、
このDoEvents()をSleep()の代わりにSetFocus()の後で呼んでみてください。
また、SendInput()の後にもDoEvents()を呼んでみてください。
こちらではこれでうまく動きました。
SetFocus()という関数はどうやら内部で
SendMessage(hwnd,WM_KILLFOCUS,0,0)と
SendMessage(hwnd,WM_SETFOCUS,0,0)を呼んでいるようなので、
同じ関数内で、SetFocus()を2回以上呼び出すと最後の呼び出しだけが有効となるようです。
これを避けるためには関数内でメッセージループを強制的に回してやって
フォーカスがエディットボックスに移るのを待って、キーイベントを発生させ、
次のフォーカスへ移動してやればよいです。
P.S.
DoEvents()って意外と使う場面が多いですね。
急場しのぎとはいえVBに感謝ですね。
コード: 全て選択
Function DoEvents() As Long
Dim msg As MSG
While PeekMessage(msg,NULL,0,0,PM_REMOVE)=TRUE
Select Case msg.message
Case WM_QUIT
ExitProcess(0)
Case Else
TranslateMessage(msg)
DispatchMessage(msg)
End Select
Sleep(0)
Wend
End Function
このDoEvents()をSleep()の代わりにSetFocus()の後で呼んでみてください。
また、SendInput()の後にもDoEvents()を呼んでみてください。
こちらではこれでうまく動きました。
SetFocus()という関数はどうやら内部で
SendMessage(hwnd,WM_KILLFOCUS,0,0)と
SendMessage(hwnd,WM_SETFOCUS,0,0)を呼んでいるようなので、
同じ関数内で、SetFocus()を2回以上呼び出すと最後の呼び出しだけが有効となるようです。
これを避けるためには関数内でメッセージループを強制的に回してやって
フォーカスがエディットボックスに移るのを待って、キーイベントを発生させ、
次のフォーカスへ移動してやればよいです。
P.S.
DoEvents()って意外と使う場面が多いですね。
急場しのぎとはいえVBに感謝ですね。
SendInput でアクティブウィンドウに送信 [解決]
NoWest様、ありがとう御座いました。
以前にも色々教えて頂きまして、ありがとう御座います。
これからも、宜しくお願いします。
DoEvents で解決しました。(凄いですね。^ ^)このDoEvents()をSleep()の代わりにSetFocus()の後で呼んでみてください。
また、SendInput()の後にもDoEvents()を呼んでみてください。
こちらではこれでうまく動きました。
以前にも色々教えて頂きまして、ありがとう御座います。
これからも、宜しくお願いします。