モーダルダイアログ上のエディットボックスについて
Posted: 2008年6月01日(日) 03:49
モーダルダイアログ上のエディットボックスでのキー入力メッセージ取得について
教えてください。
モーダルダイアログにエディットボックス(一行)が一つ、
その下にOKと書かれたボタンが一つあるとします。
そのエディットボックスに、例えば数字を入力してEnterキーを押すと
フォーカス*が下のOKボタンに移る、というようにしたいのですが、
(つまり数字を入力してEnterを二回タンタンと押せばOKボタンを押せる、
というような)
どうもうまくいきません。
ActiveBasicFanさんのHPで解説されていた「フック」という方法を試してみたの
ですが、エディットボックスを使うとなると少し勝手がちがうのかなと。。
下はそのソースです。(AB4.24 プロジェクト)
書くと今度はOKボタンをEnterで押したときにもその処理に飛んでいってしまうのです。
と書いたので「エディットボックスのメッセージループ」にのみ関係しているんじゃ
ないかと思うのですが、ボタンの方にも影響してしまいます。
これを回避するにはとあれこれ考えてはみるのですが、そんなにいい考えも無く、
フックというやり方以外にも何かあるのかなとも思ったり。。
いずれにしても、もし良い方法があれば教えてください。
(* 単にフォーカスだけ移ればいいというのでも無いようです。
単にSetFocusなどでフォーカスをセットするだけでは
ボタンに点線は付くのですが、ボタン周りの黒枠が付きません。)
教えてください。
モーダルダイアログにエディットボックス(一行)が一つ、
その下にOKと書かれたボタンが一つあるとします。
そのエディットボックスに、例えば数字を入力してEnterキーを押すと
フォーカス*が下のOKボタンに移る、というようにしたいのですが、
(つまり数字を入力してEnterを二回タンタンと押せばOKボタンを押せる、
というような)
どうもうまくいきません。
ActiveBasicFanさんのHPで解説されていた「フック」という方法を試してみたの
ですが、エディットボックスを使うとなると少し勝手がちがうのかなと。。
下はそのソースです。(AB4.24 プロジェクト)
ここにモーダルダイアログ(hDialog1)のソースが表示されます。 [ここをクリックすると内容が表示されます]
エディットボックスでのEnterキーの受付は出来るのですが、そこに何か処理をコード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [Dialog1] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hDialog1
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim hHook As Long 'フックハンドル
Const WH_GETMESSAGE = 3 'フックの種類を示す定数
Const HC_ACTION = 0
'フックをインストールする関数の宣言
Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(idHook As DWord, _ 'インストールするフックの種類
lpfn As DWord, _ 'インストールするフック関数のアドレス
hMod As DWord, _ 'インスタンスハンドル
dwThreadId As DWord _ 'カレントスレッドID
) As DWord '戻り値は、フックハンドル
'フックをアンインストールする関数の宣言
Declare Function UnhookWindowsHookEx Lib "user32" _
(hHook As DWord) As DWord
'次のフックを呼び出す関数の宣言
Declare Function CallNextHookEx Lib "user32" _
(hHook As DWord, nCode As Long, _
wParam As DWord, lParam As DWord) As DWord
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function Dialog1Proc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
Dialog1Proc=EventCall_Dialog1(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
'
'●デストロイ
'
Sub Dialog1_Destroy()
'Hookのアンインストール(勝手に場所を元のソースから変更したのですが、
ただ、ここでアンインストールしていいのかどうか。。)
UnhookWindowsHookEx(hHook)
End Sub
'
'●クリエイト
'
Sub Dialog1_Create(ByRef CreateStruct As CREATESTRUCT)
'Hookのインストール
hHook = SetWindowsHookEx(WH_GETMESSAGE,_
AddressOf(GetMsgProc), 0,_
GetWindowThreadProcessId(_
GetDlgItem(hDialog1,EditBox1),NULL))
If hHook=0 Then
MessageBox(hDialog1,"Install Failed", "", MB_OK)
End If
End Sub
'
'●ボタン1クリック・イベント
'
Sub Dialog1_CommandButton1_Click()
MessageBox(hDialog1,"Dialog1_CommandButton1_Click","Message",MB_OK)
End Sub
'
'●エディットボックスのメッセージ取得
'
Function GetMsgProc(code As Long, wParam As DWord, lParam As DWord) As DWord
Dim msg As *MSG
If code = HC_ACTION Then
'lParamは、メッセージが格納されているメモリ領域の _
'アドレスを示すポインタなので、 _
'そのままMSG構造体ポインタにコピーする
msg=lParam
If msg->message = WM_KEYDOWN And_
msg->wParam = VK_RETURN Then
'EnterならフォーカスをCommandButton1に単に投げているだけ。テスト処理。
Print "VK_RETURN"
SetFocus(GetDlgItem(hDialog1,CommandButton1))
End If
End If
'次のフックを呼び出す
GetMsgProc = CallNextHookEx(hHook,code,wParam,lParam)
End Function
書くと今度はOKボタンをEnterで押したときにもその処理に飛んでいってしまうのです。
コード: 全て選択
'Hookのインストール
hHook = SetWindowsHookEx(WH_GETMESSAGE,_
AddressOf(GetMsgProc), 0,_
GetWindowThreadProcessId(_
GetDlgItem(hDialog1,EditBox1),NULL))
ないかと思うのですが、ボタンの方にも影響してしまいます。
これを回避するにはとあれこれ考えてはみるのですが、そんなにいい考えも無く、
フックというやり方以外にも何かあるのかなとも思ったり。。
いずれにしても、もし良い方法があれば教えてください。
(* 単にフォーカスだけ移ればいいというのでも無いようです。
単にSetFocusなどでフォーカスをセットするだけでは
ボタンに点線は付くのですが、ボタン周りの黒枠が付きません。)