おせわになります。
開発環境は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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(Microsoft Office) Office(Windows版,Word/Excel/PowerPoint等)にログインできません 4 2022/07/24 15:18
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- マウス・キーボード キーボード設定で困っています。長文です。 2 2022/12/10 12:44
- Excel(エクセル) エクセルのバージョン2016フリーズ改善策 5 2022/12/13 09:13
- マウス・キーボード テンキーの設定がおかしくなっています。 5 2023/08/09 15:35
- Windows 10 エクスプローラで希望の場所が表示できない 2 2023/06/29 15:19
- Excel(エクセル) 表内で、Enterキーで横→行の最後入力したら次の行の先頭に移動するマクロを作りたい 3 2022/05/01 21:19
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Win32APIにて、ウィンドウ全体...
-
ゲームとかの解像度変更&全画...
-
WM_CREATE について
-
Win32でシリアル通信
-
LoadImageを使用し、タイトルバ...
-
コンソールアプリケーションの...
-
C++のcase文の書き方
-
音量調節
-
LoadImageとSetCursorについて
-
Win32APIでウィンドウを中央に...
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
マイナスからプラスへ転じた時...
-
fgetsなどのときのstdinのバッ...
-
*をユーザーが入力した数字の数...
-
C言語のfor文です。 繰り返しの...
-
C言語
-
「指定されたキャストは有効で...
-
float型とdouble型の変数の違い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
C言語win32api、エディットボッ...
-
音量調節
-
エディットコントロール入力時...
-
プログラミングでエラーが出ま...
-
エラー Run-Time Check Failur...
-
キャレットの現在位置の表示 (W...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
ボタンの色(WINAPI)
-
COMPORTマルチスレッドで例外発生
-
C++のcase文の書き方
-
Win32APIでウィンドウを中央に...
-
PeekMessageについて
-
CTreeCtrlのCreate関数でエラー...
-
オーバーレイみたいな処理がしたい
-
この列挙体でsysjanの関数はあ...
-
DirectInputについて再
おすすめ情報