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 : }
バッグ サイトcrocs walu[ヴィクトリアモデル]ブレスレット ランキング<a href="http://www.forshoppingCanadianjp.biz" title="トート 人気">トート 人気</a>ファッション 通販 ブランドブレスレット 人気http://www.forshoppingbasisjp.biz/[ヴィクトリア下着]<a href="http://www.forshoppingbeamjp.biz" title="ヴィクトリア水着">ヴィクトリア水着</a>kate spade nylon tateバッグ レディース 人気モンクレール japan<a href="http://www.forshoppingbarreljp.biz" title="ダウン モンクレ">ダウン モンクレ</a>[ミランダカーヴィクトリアシークレット]http://www.breedshopcommercialjp.biz/[ビクトリアメイク]crocs 店舗<a href="http://www.forshoppingcagejp.biz" title="[维多利亚的秘密水着]">[维多利亚的秘密水着]</a>[ビクトリアシークレットのモデル]通販 バックcrocs crocband<a href="http://www.chendecar.com" title="[ヴィクトリアシークレット公式サイト]">[ヴィクトリアシークレット公式サイト]</a>http://www.mullerelephantjp.info/
日本的な人気と信頼を得ています。<br>安心、安全にお届けします<br>価格、品質、自信のある商品を取り揃えておりますので、<br>当店の主要な経営のブランド:(ヴィトン ) シャネル(シャネル) Rolex(ロレックス)など.<br>当店は主に経営する商品:かばん.バッグ .財布 .キーケース. .腕時計など.<br>日本には無い商品,日本では高価な商品,弊社のない商品,取引先を代理して製造会社を連絡することができる. <br>弊社長年の豊富な経験と実績があり.輸入手続も一切は弊社におまかせできます.ご希望の商品を責任を持ってお届けします.<br>当店の商品は特恵を与える。<br>興味あれば、是非ご覧下さい<br>財布、腕時計、バッグ一品市場