みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

16進数入力制限方法

いつもお世話になっております。
今回はEDITボックスの入力制限方法についてお聞きしたいです。
現在、あるプログラムで、EDITボックスに16進数で入力する欄を作っています。
今の状態では、入力後ボタンを押したときに一文字ずつチェックして一つでも失敗すればエラーを返すのですが、
できればEDITボックスに0~9、a~f、A~F以外の文字を入力しようとしても無視するように(無反応に)したいです。
EDITボックスをサブクラス化すればできそうですが、もっとスマートにできると思って探してみましたが見つけられませんでした。
何か方法があればご教授願いたいです。

環境はWindowsXP,VC6.0
使えるのはSDK,ATL/WTL,STLです。
以上、よろしくお願いします。

投稿日時 - 2008-11-23 18:11:00

QNo.4501170

困ってます

質問者が選んだベストアンサー

>キーボードフックとかあるのですが
うーん、自分のアプリケーションに対する文字入力の制限に
フックなんて大げさな。。。
と思ってしまうのだけど
特にグローバルフックによる「横取り」は、
ウィルス対策ソフトにウィルスと誤認される可能性もありますし、
アプリケーションが強制終了などするとシステム全体が
不安定になったりして変に多用するとあまりいいことがありません。

素直にキーが押されて内容が変更された場合に、
想定している物かどうかをチェックして、
削除でいいと思います。
#No1さんの方法。

投稿日時 - 2008-11-25 11:09:21

お礼

ご回答ありがとうございます。

フックの方法は確かにたいそうなものになってしまうのでサブクラス化してWM_CHARで入力毎に確認して実現しました。

ご回答ありがとうございました。

投稿日時 - 2008-11-25 21:10:53

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

 こんばんは。

 まあ、キーボードフックとかあるのですが、反ってメッセージのもぐら叩きになってしまう様です。
 雑ですが、こんな感じで大方達成出来きるようです。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;

投稿日時 - 2008-11-24 00:23:37

お礼

ご回答ありがとうございます。

フックの方法はたいそうなものになってしまうのでサブクラス化してWM_CHARで入力毎に確認して実現しました。
サンプルまで示していただきありがとうございました。

投稿日時 - 2008-11-25 21:12:05

ANo.1

Wr5

EN_UPDATEの契機で、該当のエディトボックスの内容を取得して、
16進数以外の文字が入っていたら削除して再設定し直す。
というのはどうでしょうか?

投稿日時 - 2008-11-23 23:55:23

あなたにオススメの質問