プロが教える店舗&オフィスのセキュリティ対策術

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

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

A 回答 (3件)

>キーボードフックとかあるのですが


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

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

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

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

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

お礼日時:2008/11/25 21:10

 こんばんは。



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

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

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

お礼日時:2008/11/25 21:12

EN_UPDATEの契機で、該当のエディトボックスの内容を取得して、


16進数以外の文字が入っていたら削除して再設定し直す。
というのはどうでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!