MainWndに置いたCommandButtonにSetFocus関数でFocusすると、SPACEキ-では押せますがENTERキ-では押せません。
どうしたら押せますか?
(Ver 4.24.00を使用)
ちなみにMessageBox関数でuTypeをMB_OKとした場合などや、他のアプリソフトでは画面に配置したFocusのあるCommandButtonはSPACEキ-でもENTERキ-でも押せています。
また、Focusしないで
SendMessage(hCommandButton1, BM_SETSTYLE, BS_DEFPUSHBUTTON, 1)
として、MainWnd_KeyPressイベント内のIf条件でスタイルを指定し、ENTERとSPACEキ-を指定した場合は押せています。(これもFocusするとNG)
しかし、FocusしてMainWnd_KeyPressイベント内でGetFocus関数でもってきて、If条件でボタンにFocusがあるか?、 ENTERとSPACEキ-を指定した場合は押せません。
SetFocusしたCommandButtonをENTERキ-で押すには
アドバイスありがとうございます。
初心者ゆえあっちこっちぶつかりやっています。
他にも色々な方法があるようですが、以下内容で動いています。
(MessageBox関数でuTypeをMB_OKとした場合などや、他の方のアプリソフトでもSPACEキ-とENTERキ-では動きが違い、ENTERキ-では押された感じを出さないようなのでこれでやっています)
MainWnd_Createイベントで、でEnterKeyスレッドを生成し、ActivateFlagやCmdButton1_FocusFlagは別イベントで決めておき、
とスレッド処理。
の代わりに
とすると、ボタンが押された感じが出ますが、同時にマウスを動かしているとエラ-を起こすのでやめました。
初心者ゆえあっちこっちぶつかりやっています。
他にも色々な方法があるようですが、以下内容で動いています。
(MessageBox関数でuTypeをMB_OKとした場合などや、他の方のアプリソフトでもSPACEキ-とENTERキ-では動きが違い、ENTERキ-では押された感じを出さないようなのでこれでやっています)
MainWnd_Createイベントで、
コード: 全て選択
hEnterKey =CreateThread(ByVal NULL, 0, AddressOf(EnterKey), 0, 0, VarPtr(dwDummy))
コード: 全て選択
Function EnterKey(hWnd As DWord) As DWord
While 1
If ActivateFlag =1 Then 'ウィンドウがアクティブならスレッド処理
If CmdButton1_FocusFlag =1 Then
If GetAsyncKeyState(&h0d) and &H8000 Then '&h0d =ENTERキーでキーが押された
SendMessage(hCommandButton1, BM_CLICK, 0, 0) 'これだと押された感じが出ない
End If
End If
Sleep(20)
End If
Wend
CloseHandle(hEnterKey)
End Function
コード: 全て選択
SendMessage(hCommandButton1, BM_CLICK, 0, 0)
コード: 全て選択
SendMessage(hCommandButton1, WM_LBUTTONDOWN, 0, 0)
Sleep(30)
SendMessage(hCommandButton1, WM_LBUTTONUP, 0, 0)
通常のウィンドウでTabキーなどによる移動、Enterでの実行を実現するには、(プロジェクト名).abpのDo Loopの中を次のように書き換えます。
TranslateMessageとDispatchMessageの前にIsDialogMessageを呼ぶようにしています。
ただ、これらが結局何をやっているかというと、おそらくはゲストさんが最初に書いているBS_DEFPUSHBUTTONとSetFocusの両方を制御しているといったところだと思います。なので、個人的にはBS_DEFPUSHBUTTONの方法(をダイアログまたはIsDigalogMessage併用のウィンドウで用いる)が良いと思います。
以下余談: WM_NEXTDLGCTLというメッセージがあって、これをSetFocusの代わりに使えば良さそうとは思ったのですが、動きませんでした。おそらくAB4で作られるダイアログが本物のダイアログでないためと考えています。
コード: 全て選択
Do
iResult=GetMessage(msgMain,0,0,0)
If iResult=0 or iResult=-1 Then Exit Do
If IsDialogMessage(hMainWnd, msgMain) = FALSE Then
TranslateMessage(msgMain)
DispatchMessage(msgMain)
End If
Loop
ただ、これらが結局何をやっているかというと、おそらくはゲストさんが最初に書いているBS_DEFPUSHBUTTONとSetFocusの両方を制御しているといったところだと思います。なので、個人的にはBS_DEFPUSHBUTTONの方法(をダイアログまたはIsDigalogMessage併用のウィンドウで用いる)が良いと思います。
以下余談: WM_NEXTDLGCTLというメッセージがあって、これをSetFocusの代わりに使えば良さそうとは思ったのですが、動きませんでした。おそらくAB4で作られるダイアログが本物のダイアログでないためと考えています。
イグトランスさん、アドバイスありがとうございます。
やってみて上手く動きました(ただ、目的のボタンにはSetFocus以外にSendMessageでBS_DEFPUSHBUTTONを送り、またFocusを当ててないボタンはクリックするとサイクリックでBS_DEFPUSHBUTTONに変化するようなので、SendMessageでただのBS_PUSHBUTTONにしないといけませんが)
Flagを使ってのEnterKeyスレッドでやる方法にしろ、IsDialogMessageを使う方法にしろ、FocusのあるボタンをENTERキ-で押す方法が判りましたし、またそれぞれの注意点も判りました。
FocusのないSendMessageでBS_DEFPUSHBUTTONのみのやり方も含めて色々やってみたいと思います。
やってみて上手く動きました(ただ、目的のボタンにはSetFocus以外にSendMessageでBS_DEFPUSHBUTTONを送り、またFocusを当ててないボタンはクリックするとサイクリックでBS_DEFPUSHBUTTONに変化するようなので、SendMessageでただのBS_PUSHBUTTONにしないといけませんが)
Flagを使ってのEnterKeyスレッドでやる方法にしろ、IsDialogMessageを使う方法にしろ、FocusのあるボタンをENTERキ-で押す方法が判りましたし、またそれぞれの注意点も判りました。
FocusのないSendMessageでBS_DEFPUSHBUTTONのみのやり方も含めて色々やってみたいと思います。