いつもお世話になっております。
今回はEDITボックスの入力制限方法についてお聞きしたいです。
現在、あるプログラムで、EDITボックスに16進数で入力する欄を作っています。
今の状態では、入力後ボタンを押したときに一文字ずつチェックして一つでも失敗すればエラーを返すのですが、
できればEDITボックスに0~9、a~f、A~F以外の文字を入力しようとしても無視するように(無反応に)したいです。
EDITボックスをサブクラス化すればできそうですが、もっとスマートにできると思って探してみましたが見つけられませんでした。
何か方法があればご教授願いたいです。
環境はWindowsXP,VC6.0
使えるのはSDK,ATL/WTL,STLです。
以上、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
>キーボードフックとかあるのですが
うーん、自分のアプリケーションに対する文字入力の制限に
フックなんて大げさな。。。
と思ってしまうのだけど
特にグローバルフックによる「横取り」は、
ウィルス対策ソフトにウィルスと誤認される可能性もありますし、
アプリケーションが強制終了などするとシステム全体が
不安定になったりして変に多用するとあまりいいことがありません。
素直にキーが押されて内容が変更された場合に、
想定している物かどうかをチェックして、
削除でいいと思います。
#No1さんの方法。
ご回答ありがとうございます。
フックの方法は確かにたいそうなものになってしまうのでサブクラス化してWM_CHARで入力毎に確認して実現しました。
ご回答ありがとうございました。
No.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;
ご回答ありがとうございます。
フックの方法はたいそうなものになってしまうのでサブクラス化してWM_CHARで入力毎に確認して実現しました。
サンプルまで示していただきありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル シート内のボックスを縦並びから横並びに 7 2023/04/05 04:28
- HTML・CSS 検索窓とcssハックについて 3 2022/04/22 12:21
- Access(アクセス) capeofdragonと申します。 Access2016を使っております。 あるフォームがあり、テ 2 2022/09/09 13:18
- 工学 1つのタクトスイッチで複数の並列回路を閉じ、アースにつなげることができるスイッチはありますか。 2 2022/08/06 10:38
- UNIX・Linux bash環境でのエラー対応をお願い致します。 1 2022/11/26 17:41
- Google+ Google連絡先の検索機能について 1 2022/10/18 23:03
- 分譲マンション オートロック内に宅配ボックス 3 2023/05/16 10:17
- Excel(エクセル) Excelヘルプの原文を表示する最速の方法(手順)には? 1 2023/08/11 11:30
- その他(ソフトウェア) ソースネクストアプリをインストールし、製品登録で半角英数字が入力できない 5 2022/07/03 22:44
- 数学 数独の解法についてお聞きします 4 2023/05/25 17:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他のウィンドウのボタンを自動...
-
vbaから他のアプリを終了
-
コンソールからのメッセージボ...
-
SetWindowText関数について
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
WINAPI 他のウインドウを重ね...
-
点滅で知らせる方法
-
VB.netでFindWindowExやると・...
-
マウスの状態の取得
-
ほかのアプリケーションからの...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
VBAのフォント変更(エクセルか...
-
ガウシアンフィルタのCプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
msgboxの表示位置
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
SetWindowText関数について
-
VBAでコントロールのハンドルを...
-
Excel VBA で外部アプリケーシ...
-
VB.netでFindWindowExやると・...
-
メッセージハンドラ
-
点滅で知らせる方法
-
CloseHandle()
-
システム例外のメッセージを変...
-
WM_NCLBUTTONUPについて
-
デスクトップ上のアイコンの位...
-
メッセージループについて
-
キーボード・フックのアプリを...
-
VBでRegisterWindowMessage関数...
-
WM_CTLCOLORDLG
-
windowsメールスロットについて...
-
マウスフックについて
おすすめ情報