複数行EditBoxでショートカットキーの登録
複数行EditBoxでショートカットキーの登録
お世話になっています。
エディタを作っているのですが、複数行EditBoxで独自のショートカットキーを登録しようとしています。
今やっている方法として、EditBoxをサブクラス化し、キーのメッセージを受け取って、それに応じて処理を行うといった形にしているのですが、
この方法をすると、最初から登録されているショートカットキー以外の物を入力すると、
ビープ音がなってしまいます。
これを無くしたいのですが、どのようにすればいいのでしょうか。
ご存じの方がいらっしゃいましたら、ご教授ください。
よろしくお願いいたします。
エディタを作っているのですが、複数行EditBoxで独自のショートカットキーを登録しようとしています。
今やっている方法として、EditBoxをサブクラス化し、キーのメッセージを受け取って、それに応じて処理を行うといった形にしているのですが、
この方法をすると、最初から登録されているショートカットキー以外の物を入力すると、
ビープ音がなってしまいます。
これを無くしたいのですが、どのようにすればいいのでしょうか。
ご存じの方がいらっしゃいましたら、ご教授ください。
よろしくお願いいたします。
Re: 複数行EditBoxでショートカットキーの登録
サブクラス内でキーを判別して独自の処理をした後に、デフォルトのコールバックに戻らず return 0 してみてはどうでしょう
動作確認もしてないですしサブクラス内がどうなってるのかも分からないので当てずっぽうですが
動作確認もしてないですしサブクラス内がどうなってるのかも分からないので当てずっぽうですが
Re: 複数行EditBoxでショートカットキーの登録
上記の、7さんのコメントで解決してるかもしれませんが、
「独自のショートカットキーを登録」は当方のエディタ(※1)でも
やってる処理なので参考までにコメントします。
Q:ビープ音を無くすには?
A:サブクラス化したプロシージャ関数の戻り値に「0」を返せばOK。
以下、自コードからの抜粋です。
※1:両手たぶメモ、ってソフトです(宣伝)。
「独自のショートカットキーを登録」は当方のエディタ(※1)でも
やってる処理なので参考までにコメントします。
Q:ビープ音を無くすには?
A:サブクラス化したプロシージャ関数の戻り値に「0」を返せばOK。
以下、自コードからの抜粋です。
コード: 全て選択
'Editboxのサブクラス化プロシージャ。
Function MyEditWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
Dim buf[255] As Byte
Select Case dwMsg
Case WM_KEYDOWN
GetKeyboardState( buf )
MyEditWndProc = 0 'デフォルトを「0」(FALSE)に指定。
If( buf[VK_CONTROL] AND &H80 )Then
'Ctrlキー
If( buf[ VK_SHIFT ] AND &H80 )Then
'Shiftキー併用
If( buf[ Asc("S") ] AND &H80 )Then
'別名保存
SaveAsEditDlgTab()
Exit Function '◆ビープ音無しで抜ける。
End If
' ~中略~
End If
End If
End Select
'独自処理以外は、元プロシージャの戻り値をそのまま返す。
MyEditWndProc = CallWindowProc( vptOrgEdit, hWnd, dwMsg, wParam, lParam )
End Function
Re: 複数行EditBoxでショートカットキーの登録
返信遅くなってしまい申し訳ありません。
こちらなのですが、実際試してもやはりビープ音がなってしまいます。
淡幻星 様の「両手たぶメモ」をDLし、利用した場合ですとビープ音はなりませんでした。
私が書いているコードは以下のようになります。
サブクラス内でキーを判別して独自の処理をした後に、デフォルトのコールバックに戻らず return 0 してみてはどうでしょう
Q:ビープ音を無くすには?
A:サブクラス化したプロシージャ関数の戻り値に「0」を返せばOK。
以下、自コードからの抜粋です。コード: 全て選択
コード: 'Editboxのサブクラス化プロシージャ。 Function MyEditWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord Dim buf[255] As Byte Select Case dwMsg Case WM_KEYDOWN GetKeyboardState( buf ) MyEditWndProc = 0 'デフォルトを「0」(FALSE)に指定。 If( buf[VK_CONTROL] AND &H80 )Then 'Ctrlキー If( buf[ VK_SHIFT ] AND &H80 )Then 'Shiftキー併用 If( buf[ Asc("S") ] AND &H80 )Then '別名保存 SaveAsEditDlgTab() Exit Function '◆ビープ音無しで抜ける。 End If ' ~中略~ End If End If End Select '独自処理以外は、元プロシージャの戻り値をそのまま返す。 MyEditWndProc = CallWindowProc( vptOrgEdit, hWnd, dwMsg, wParam, lParam ) End Function
こちらなのですが、実際試してもやはりビープ音がなってしまいます。
淡幻星 様の「両手たぶメモ」をDLし、利用した場合ですとビープ音はなりませんでした。
私が書いているコードは以下のようになります。
コード: 全て選択
Function Edit1WndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
If dwMsg = WM_KEYDOWN Then
If (GetAsyncKeyState(VK_CONTROL) And &H8000) Then
Edit1WndProc = 0
If wParam = 65 Then
'Ctrl+Aが押されたら、全て選択する
MainWnd_IDM_SELECTALL_MenuClick()
End If
Edit1WndProc = 0
Exit Function
End If
End If
Edit1WndProc=CallWindowProc(OldEditProc,hWnd,dwMsg,wParam,lParam)
End Function
Re: 複数行EditBoxでショートカットキーの登録
(だいぶ間が空いてしまったので、見てないかもしれませんが)
抜けて入れば、ビープ音はならない筈なので、、、
期待したとおりにExit Functionで抜けているか、あたりを
見てみてはいかがでしょうか?
んー、Ctrl+Aが押されたときに正しくExit Functionでこちらなのですが、実際試してもやはりビープ音がなってしまいます
抜けて入れば、ビープ音はならない筈なので、、、
期待したとおりにExit Functionで抜けているか、あたりを
見てみてはいかがでしょうか?
Re: 複数行EditBoxでショートカットキーの登録
淡幻星 様
ご返信有難うございます!
たまにチェックさせて頂いております。
サブクラス化の設定なのですが、
こんなかんじで大丈夫でしょうか?
この辺りから間違っていたら大変なので、お先に質問させていただきます
ご返信有難うございます!
たまにチェックさせて頂いております。
サブクラス化の設定なのですが、
コード: 全て選択
SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
この辺りから間違っていたら大変なので、お先に質問させていただきます
Re: 複数行EditBoxでショートカットキーの登録
サブクラスについてあまりよく理解してませんが、
上記のコードで問題ないと思います。
念のためですが上記のコードの直前に下記のようなコード記載されてますか?
OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
これは元々のこのクラスのプロシージャのアドレスを取得する処理です。
ちなみに私はサブクラスについて下記のトピックを参考にしました。
ボタンの右クリック処理方法は?
問題なく動作します。
よろしくお願いいたします。
上記のコードで問題ないと思います。
念のためですが上記のコードの直前に下記のようなコード記載されてますか?
OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
これは元々のこのクラスのプロシージャのアドレスを取得する処理です。
ちなみに私はサブクラスについて下記のトピックを参考にしました。
ボタンの右クリック処理方法は?
問題なく動作します。
よろしくお願いいたします。
Re: 複数行EditBoxでショートカットキーの登録
たかせ様
ご返信有難うございます。
を行ってみましたが変わりありませんでした。
そしてふと思ったのですが、k2様の「行番号付きエディットボックス」をEditBoxに適応しているのですが、
もしかしたらこれが原因なのでしょうか…?
とりあえず、変わってはいませんがサブクラス化したコールバック関数はこのようになっています
またクリエイトイベントで
としてみました。
よろしくお願いいたします。
ご返信有難うございます。
コード: 全て選択
OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC)
そしてふと思ったのですが、k2様の「行番号付きエディットボックス」をEditBoxに適応しているのですが、
もしかしたらこれが原因なのでしょうか…?
とりあえず、変わってはいませんがサブクラス化したコールバック関数はこのようになっています
コード: 全て選択
'EditBox1のサブクラス コールバック関数
Dim OldEditProc As WNDPROC
Function Edit1WndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
If dwMsg = WM_KEYDOWN Then
If (GetAsyncKeyState(VK_CONTROL) And &H8000) Then
If wParam = 65 Then
'Ctrl+Aが押されたら、全て選択する
MainWnd_IDM_SELECTALL_MenuClick()
Else If wParam = 83 Then
'Ctrl+Sが押されたら、保存する
MainWnd_IDM_SAVE_MenuClick()
Else If wParam = 79 Then
'Ctrl+Oが押されたら、ファイルを開く
MainWnd_IDM_OPEN_MenuClick()
Else If wParam = 191 Then
'Ctrl+/が押されたら、文字数カウント
MainWnd_IDM_TEXTCOUNT_MenuClick()
Else If wParam = 70 Then
'Ctrl+Fが押されたら、検索置換
MainWnd_IDM_TEXTSEARCH_MenuClick()
Else If wParam = 188 Then
'Ctrl+,が押されたら、環境設定
MainWnd_IDM_SETTING_MenuClick()
End If
End If
Exit Function
debug
End If
Edit1WndProc=CallWindowProc(OldEditProc,hWnd,dwMsg,wParam,lParam)
End Function
またクリエイトイベントで
コード: 全て選択
'EditBoxのサブクラス化
OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC)
SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
よろしくお願いいたします。
Re: 複数行EditBoxでショートカットキーの登録
大変間が空いてしまってすみません。
(なかなか来れませんでした・・・)
で、先の私の投稿、間違いがありました。大変申し訳ないです。
ビープ音を消すには、WM_DOWNでExit Functionするだけでは不十分でした。
WM_CHARを捉まえて、これに対してもExit Functionしてあげてください。
自コードの場合は、WM_DOWNの処理に続いて、下記のように書いてました。
V~Gと記述しているキーとCtrl同時押しに対して、ビープ音とデフォルト動作を無効化しています。
なお「行番号付き~」は当方も同じ実装をしているので、
そちらは関係ないと思います。
なお×2、GetAsyncKeyState()は、キーを同時押しが増えると検知できない時があります。
GetKeyboardState()の方がお勧めです。
参考サイト:
http://zahyou.6.ql.bz/cgame/key.htm
http://rina.jpn.ph/~rance/directx8/03/03.html
(なかなか来れませんでした・・・)
で、先の私の投稿、間違いがありました。大変申し訳ないです。
ビープ音を消すには、WM_DOWNでExit Functionするだけでは不十分でした。
WM_CHARを捉まえて、これに対してもExit Functionしてあげてください。
自コードの場合は、WM_DOWNの処理に続いて、下記のように書いてました。
V~Gと記述しているキーとCtrl同時押しに対して、ビープ音とデフォルト動作を無効化しています。
コード: 全て選択
Case WM_CHAR
GetKeyboardState( buf )
If( buf[VK_CONTROL] AND &H80 )Then
'Ctrlキーの場合は、独自処理において、エラー音&Def操作を消す。
If( (buf[ Asc("L") ] AND &H80) _
or (buf[ Asc("V") ] AND &H80) _
or (buf[ Asc("A") ] AND &H80) _
or (buf[ Asc("S") ] AND &H80) _
or (buf[ Asc("F") ] AND &H80) _
or (buf[ Asc("H") ] AND &H80) _
or (buf[ Asc("R") ] AND &H80) _
or (buf[ Asc("T") ] AND &H80) _
or (buf[ Asc("N") ] AND &H80) _
or (buf[ Asc("B") ] AND &H80) _
or (buf[ Asc("Q") ] AND &H80) _
or (buf[ Asc("W") ] AND &H80) _
or (buf[ Asc("J") ] AND &H80) _
or (buf[ Asc("U") ] AND &H80) _
or (buf[ Asc("E") ] AND &H80) _
or (buf[ Asc(" ") ] AND &H80) _
or (buf[ Asc("M") ] AND &H80) _
or (buf[ Asc("G") ] AND &H80) _
)Then
MyEditWndProc = 0
Exit Function
End If
End If
そちらは関係ないと思います。
なお×2、GetAsyncKeyState()は、キーを同時押しが増えると検知できない時があります。
GetKeyboardState()の方がお勧めです。
参考サイト:
http://zahyou.6.ql.bz/cgame/key.htm
http://rina.jpn.ph/~rance/directx8/03/03.html
Re: 複数行EditBoxでショートカットキーの登録
淡幻星 様
ご回答有り難うございます。
感謝感激でございます!
これで、求めていたものはできました!!
……のですが……
Ctrl+Z、つまり、「戻す」機能が思ったように実行できません。
適当に文字を書き、Ctrl+Zを押すと、
普通なら文字が消える(または、以前の文字に置き換わる)はずなのですが、
一番最初の文字に戻ってしまうだけになります。
少しわかりにくいので、以下に詳細の図をば……

この現象は……何故なのでしょうか?
なお、「戻る」は
※hEdit = GetDlgItem(hMainWnd, EditBox1)
を利用しています。
よろしければご教授ください。
ご回答有り難うございます。
お忙しい中対応していただきありがとうございます><大変間が空いてしまってすみません。
(なかなか来れませんでした・・・)
感謝感激でございます!
こちらを実行したところ、ビープ音が消えました!ありがとうございます!!ビープ音を消すには、WM_DOWNでExit Functionするだけでは不十分でした。
WM_CHARを捉まえて、これに対してもExit Functionしてあげてください。
これで、求めていたものはできました!!
……のですが……
Ctrl+Z、つまり、「戻す」機能が思ったように実行できません。
適当に文字を書き、Ctrl+Zを押すと、
普通なら文字が消える(または、以前の文字に置き換わる)はずなのですが、
一番最初の文字に戻ってしまうだけになります。
少しわかりにくいので、以下に詳細の図をば……

この現象は……何故なのでしょうか?
なお、「戻る」は
コード: 全て選択
SendMessage(hEdit,WM_UNDO,0,0)
を利用しています。
よろしければご教授ください。
Re: 複数行EditBoxでショートカットキーの登録
Beep音が消えたようで良かったです。
Ctrl+Zの件は、、、分かりません。
本件のWM_CHARに対する処理を追加してから、の現象でしょうか?
WM_CHARでCtrl+Zを捉まえては「いない」のですよね?
行番号の件は、、、フォントをうまく取得出来ていないんだと思います。
もし、私が投降したコードを利用しているのであれば、
SelectObject( hDC, SendMessage( hWnd, WM_GETFONT, 0, 0 ) )
の部分で、SendMessage( hWnd, WM_GETFONT, 0, 0 )の値が失敗していないか
確認してください。
※K2さんのコードの場合は、hFont_MainWndを設定しているので、
RADで設定したフォントの縦幅になります。
以上です。
Ctrl+Zの件は、、、分かりません。
本件のWM_CHARに対する処理を追加してから、の現象でしょうか?
WM_CHARでCtrl+Zを捉まえては「いない」のですよね?
行番号の件は、、、フォントをうまく取得出来ていないんだと思います。
もし、私が投降したコードを利用しているのであれば、
SelectObject( hDC, SendMessage( hWnd, WM_GETFONT, 0, 0 ) )
の部分で、SendMessage( hWnd, WM_GETFONT, 0, 0 )の値が失敗していないか
確認してください。
※K2さんのコードの場合は、hFont_MainWndを設定しているので、
RADで設定したフォントの縦幅になります。
以上です。
Re: 複数行EditBoxでショートカットキーの登録
淡幻星 様
ご返信遅れてしまい申し訳ありません!
最近研究に追われていて、ろくにプログラミングをしていない……
まず、行番号の件、解決しました!
>K2さんのコードの場合は、hFont_MainWndを設定しているので
完全にこれでした…指定し直すとできました!
戻るの方は……まだ謎です。
ご返信遅れてしまい申し訳ありません!
最近研究に追われていて、ろくにプログラミングをしていない……
まず、行番号の件、解決しました!
>K2さんのコードの場合は、hFont_MainWndを設定しているので
完全にこれでした…指定し直すとできました!
戻るの方は……まだ謎です。