- ベストアンサー
16進数入力制限方法
いつもお世話になっております。 今回はEDITボックスの入力制限方法についてお聞きしたいです。 現在、あるプログラムで、EDITボックスに16進数で入力する欄を作っています。 今の状態では、入力後ボタンを押したときに一文字ずつチェックして一つでも失敗すればエラーを返すのですが、 できればEDITボックスに0~9、a~f、A~F以外の文字を入力しようとしても無視するように(無反応に)したいです。 EDITボックスをサブクラス化すればできそうですが、もっとスマートにできると思って探してみましたが見つけられませんでした。 何か方法があればご教授願いたいです。 環境はWindowsXP,VC6.0 使えるのはSDK,ATL/WTL,STLです。 以上、よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>キーボードフックとかあるのですが うーん、自分のアプリケーションに対する文字入力の制限に フックなんて大げさな。。。 と思ってしまうのだけど 特にグローバルフックによる「横取り」は、 ウィルス対策ソフトにウィルスと誤認される可能性もありますし、 アプリケーションが強制終了などするとシステム全体が 不安定になったりして変に多用するとあまりいいことがありません。 素直にキーが押されて内容が変更された場合に、 想定している物かどうかをチェックして、 削除でいいと思います。 #No1さんの方法。
その他の回答 (2)
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 まあ、キーボードフックとかあるのですが、反ってメッセージのもぐら叩きになってしまう様です。 雑ですが、こんな感じで大方達成出来きるようです。VC6のATL/WTLです。 class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>, public CMessageFilter, public CIdleHandler { public: // 省略・・・ // //エディットボックス LRESULT OnEdit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if(wID != IDC_EDIT1) return 0; switch(wNotifyCode) { case EN_SETFOCUS://フォーカスが来たらフック _S_hhk = ::SetWindowsHookEx(WH_KEYBOARD, &CMainDlg::KeyHookProc, ::GetModuleHandle(0), 0); break; case EN_KILLFOCUS: //フォーカスが失効したら、フック解除 ::UnhookWindowsHookEx(_S_hhk); } return 0; } //0~9のテンキーとナンバーキーとA~Fと←→↑↓とリターンキーとスペースキーとバックキーとタブキー static bool IsAcept(WORD wCode) { return (wCode >= 0x30 && wCode <= 0x39) || (wCode >= 0x60 && wCode <= 0x69) || (wCode >= 0x41 && wCode <= 0x46) || (wCode >= 0x25 && wCode <= 0x28) || (wCode == VK_RETURN) || (wCode == VK_SPACE) || (wCode == VK_BACK) || (wCode == VK_TAB); } //フックプロシージャ static LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode < 0) return CallNextHookEx(_S_hhk, nCode, wParam, lParam); //ココで受け入れるかどうか決める if(IsAcept(wParam)) return CallNextHookEx(_S_hhk, nCode, wParam, lParam); return TRUE; } //フックハンドル static HHOOK _S_hhk; }; HHOOK CMainDlg::_S_hhk = 0;
お礼
ご回答ありがとうございます。 フックの方法はたいそうなものになってしまうのでサブクラス化してWM_CHARで入力毎に確認して実現しました。 サンプルまで示していただきありがとうございました。
- Wr5
- ベストアンサー率53% (2173/4061)
EN_UPDATEの契機で、該当のエディトボックスの内容を取得して、 16進数以外の文字が入っていたら削除して再設定し直す。 というのはどうでしょうか?
お礼
ご回答ありがとうございます。 フックの方法は確かにたいそうなものになってしまうのでサブクラス化してWM_CHARで入力毎に確認して実現しました。 ご回答ありがとうございました。