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>財布、腕時計、バッグ一品市場