メニュー
Infomation
■お知らせ
[スパム対策]コメントにURLを含めると自動的に削除されます。
■このサイトについて
一応残していますが、全時代の遺物。全ての情報は古く役に立ちません 連絡先:メールアドレス
■日記更新情報
RSSRSS|RSS(本文のみ)|lirs
実験&リサーチ
巡回先
製作環境
 

 



2004|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|11|12|
2011|01|
2014|05|08|
2017|07|
2018|03|
2020|08|10|
2021|11|

2004年11月07日(Sunday)

_ 時間が無い、無い、無い。

えーっと、明日から北海道いってきます(ぇー

気のせいか今週飛行機にのって帰ってきたばっかりな気がしたりもするけれど、今度は羽田じゃなくて名古屋空港だから楽チンだわーい('A`)メンドクセみたいな感じです。

IPNuts導入とか、たまってる更新作業とか、つくりかけたままのプログラムとか、家でやりたい事が山積してるんですが、最近家にあんまり帰ってないせいで全然進まない。

いや、忙しいって雰囲気でもないんですが、やっぱり忙しいような。

あれれ、おかしいな。


2006年11月07日(Tuesday)

_ [コンピュータ] ダイアログでキー入力を受け取る方法

Win32環境での話。

よくツールとしてダイアログベースのアプリケーションを作るのだが、ツールの操作性を高めるためにキーボードで操作したくなる事が多々ある。

特に頻度の多い作業だとそれこそ1キーでアクションを実行したくなるが、困った事にダイアログプロージャにはWM_KEYDOWN等のメッセージが飛んでこない。

さて、ここでいつも僕は困っているわけだが、どうしたら良いのか?

実は本気で正しい方法が判らない。

結局いつも以下のソースのようにウインドウがアクティブになったときにキーボードフックをかけて、非アクティブになったら外すというやり方をしている。

はっきり言ってメンドクサイ。

うーん。素直にモーダレスダイアログにしてメッセージループの中から取り出した方が良いのだろうか。

それはそれで面倒そうなんだけれども。

良い方法、正しい方法をご存知の方はご教授ください・・・。

_ テストプログラムソース

これはこれで不安なんですが、試しに書いてみるとこんな感じ?

     1 : #include <windows.h>
     2 : #include "resource.h"
     3 : 
     4 : HINSTANCE g_hInst;
     5 : HHOOK g_hHook;
     6 : HWND g_hDlg;
     7 : 
     8 : LRESULT CALLBACK fnHookProc(int nCode, WPARAM wp, LPARAM lp)
     9 : {
    10 :     if (nCode < 0)
    11 :         return CallNextHookEx(g_hHook, nCode, wp, lp);
    12 : 	if(nCode == HC_ACTION){
    13 : 		SendMessage(g_hDlg,
    14 : 			(lp & 0x80000000) ? WM_KEYUP : WM_KEYDOWN,
    15 : 			wp,lp);
    16 : 	}
    17 :     return TRUE;
    18 : }
    19 : 
    20 : BOOL fnDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
    21 : {
    22 :     switch (msg) {
    23 : 		case WM_ACTIVATE:
    24 : 			if(wp != WA_INACTIVE){
    25 : 				g_hDlg  = hDlgWnd;
    26 : 				g_hHook = SetWindowsHookEx(
    27 : 					WH_KEYBOARD,(HOOKPROC)fnHookProc,
    28 : 					g_hInst,0); 
    29 : 			}else{
    30 : 				UnhookWindowsHookEx(g_hHook);
    31 : 			}
    32 : 			break;
    33 :         case WM_COMMAND:
    34 :             switch (LOWORD(wp)) {
    35 :                 case IDOK:EndDialog(hDlgWnd, IDOK);break;
    36 :             }
    37 : 			break;
    38 : 		case WM_KEYDOWN:
    39 : 			{
    40 : 				char szTemp[100];
    41 : 				wsprintf(szTemp,"Keydown = %02X",wp);
    42 : 				MessageBox(hDlgWnd,szTemp,"WM_KEYDOWN",NULL);
    43 : 			}
    44 : 			break;
    45 : 
    46 :     }
    47 :     return FALSE;
    48 : }
    49 : 
    50 : int WINAPI WinMain(HINSTANCE hInst,
    51 : 	HINSTANCE hPrevInst,
    52 : 	LPSTR lpsCmdLine,
    53 : 	int nCmdShow)
    54 : {
    55 : 	g_hInst = hInst;
    56 : 	DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),
    57 : 		NULL,(DLGPROC)fnDlgProc);
    58 : 	return 0;
    59 : }
本日のコメント(全2件) [コメントを投稿]

§ Neorbessuts [&#12496;&#12483;&#12464;&#32;&#12469;&#12452;&#12488;&#99;..]

§ スーパーコピーブランド時計N級品 [日本的な人気と信頼を得ています。 安心、安全にお届けします 価格、品質、自信のある商品を取り揃えておりますので、 当..]


最近のコメント

364,000 at 2008.06.14
Copyright (c) Suika KNOnline.NET