おせわになります。
開発環境はWindowsXP、VisualC++.NET、SDK開発です。
ダイアログ上のテキストボックスでエンターキーが入力されたら、
値を取り込むというプログラムを考えています。
ただ、WM_KEYDOWNではENTERが検出できないで困っています。
WM_SYSKEYでもENTERを押してもOKボタンが押されてしまいます。
過去のログを見ますとTranslateMessageでフックするというような
記述がありますが、具体的なコードは無いでしょうか?
メイン関数内のループでMSGを処理するのではと思っていますが
思うような動作が出来ません。
No.2ベストアンサー
- 回答日時:
複数行のエディットフィールドであれば
BOOL CALLBACK DlgProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
{
static LONG preProc;
switch (GetDlgCtrlID(hDlg)==IDC_EDIT1?WM_USER+1:msg)
{
case WM_USER+1:
switch (msg)
{
case WM_CHAR:
if (wParam==13) MessageBeep(0);
}
return CallWindowProcA((WNDPROC)preProc,hDlg,msg,wParam,lParam);
case WM_INITDIALOG:
preProc=SetWindowLong(GetDlgItem(hDlg,IDC_EDIT1),GWL_WNDPROC,(LONG)DlgProc);
return 1;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hDlg,0);
return 1;
}
}
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR nCmdLine,
int lCmdShow)
{
DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,DlgProc,0);
return 0;
}
と言う感じ(重複サブクラスプロシージャ)でシンプルにできます。
ただし、1行専用フィールドと場合はスレッドフックが必要です。
<セット>
hHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,0,GetCurrentThreadId());
<プロシージャ>
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
if (nCode===HC_ACTION) if (wParam==0xD)
{
ここでエンターキー入力の処理
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
と言った感じでできると思いますよ。
スレッドフックは参考URLを参照してください。
参考URL:http://www.kumei.ne.jp/c_lang/sdk2/sdk_160.htm
No.1
- 回答日時:
ご希望の方法とは違うかもしれませんが、テキストボックス等のコントロールを含む
ウィンドウのウィンドウプロシージャの変更を行うサブクラス化というものがあります。
HWND hwTx; //テキストボックスのウィンドウハンドル
WNDPROC wpDef; //テキストボックスのデフォルトのウィンドウプロシージャのアドレス
//ウィンドウプロシージャのアドレスを取得
wpDef = (WNDPROC)GetWindowLong( hwTx, GWL_WNDPROC );
//新たにウィンドウプロシージャを設定する
SetWindowLong( hwTx, GWL_WNDPROC, (LONG)WinProcCnt );
//新しいウィンドウプロシージャ
LRESULT CALLBACK WinProcCnt( HWND hw, UINT msg, WPARAM wp, LPARAM lp )
{
switch( msg ){
case WM_CHAR:
switch( LOWORD(wp) ){
case VK_RETURN:
//ENTER入力時の処理
break;
}
}
//デフォルトのウィンドウプロシージャへ
return CallWindowProc( wpDef, hw, msg, wp, lp );
}
参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/w …
この回答への補足
回答ありがとうございます。
サブクラス化をしたのですが思ったような動作が出来ません。
状況としては、ダイアログのある場所をクリックすると
CreateWindowでエディットボックス(改行無し)を作成し、数値を入れてEnterキーを押すと数値が反映されるようにしたいと思っています。
具体的には以下のコードを書いています。
//クリックした所にエディットボックスを貼り付ける
g_hEdit=CreateWindow("EDIT",szText
,WS_CHILD | WS_VISIBLE | ES_RIGHT,//ウィンドウスタイル
rcAll.left,rcAll.top,//X.Y
rcAll.right-rcAll.left,rcAll.bottom-rcAll.top,//幅、高さ
GetDlgItem(hWnd,IDC_LIST1),//親ウィンドウのハンドル
(HMENU)IDC_LISTEDIT,//コントロールID
g_Inst,//インスタンスハンドル
NULL);
//サブクラス化
g_orgListEditProc=(WNDPROC)SetWindowLong(g_hEdit,GWL_WNDPROC,(LONG)ListEditProc);
SendMessage(g_hEdit, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(FALSE, 0));
SetFocus(g_hEdit);
新しいエディットボックスに数値を入れてエンターキーを押すと、
IDOKに飛んでしまうのです。
エディットボックス内に普通の数字を入れるとKEYDOWNで検知できているのですが、Enterキーは検知できません。WM_SYSKEYでも検知できません。
動作としては、エディットボックスではなくIDOKボタンにフォーカスが行っている状態のようにみえます。
状況を説明してみたのですがいかがでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
エディットコントロールでEnter押した時の動作
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
エディットボックスの入力制限について
C言語・C++・C#
-
-
4
C# Listを使わずに2次元配列の動的確保をしたいです。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンのアイコン表示
-
仮想リストの指定行の色(バー...
-
ダイアログプログラムでEnterキ...
-
return文がない場合の戻り値は...
-
MessageBoxについて
-
ウィンドウハンドルがメッセー...
-
windowsAPI 画像の表示
-
Win32APIでウィンドウを中央に...
-
C言語win32api、エディットボッ...
-
ウィンドウ非表示に時に表示し...
-
エラー Run-Time Check Failur...
-
WinAPIでの画像高速切り替え表...
-
DirectInputについて再
-
エディットコントロール入力時...
-
2÷3などの余りについて
-
「指定されたキャストは有効で...
-
ある商品のロス率を5%見込み、...
-
信頼区間の1.96や1.65ってどこ...
-
C言語でセルオートマトンを作成...
-
20'(角度)の計算がわかりま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダイアログプログラムでEnterキ...
-
エディットボックスの背景の色...
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
C言語win32api、エディットボッ...
-
C#のswitch文を簡略化したいの...
-
LoadImageを使用し、タイトルバ...
-
コンソールアプリケーションの...
-
COMPORTマルチスレッドで例外発生
-
ウィンドウ非表示に時に表示し...
-
エラー Run-Time Check Failur...
-
ポップアップメニュー
-
Win32のファイルダイアログのサ...
-
キャレットの現在位置の表示 (W...
-
不明なエラー
-
ボタンの色(WINAPI)
-
Win32APIにて、ウィンドウ全体...
-
ゲームとかの解像度変更&全画...
-
エディットコントロール入力時...
-
MoveToExとLineToについて
おすすめ情報