えーっと、明日から北海道いってきます(ぇー
気のせいか今週飛行機にのって帰ってきたばっかりな気がしたりもするけれど、今度は羽田じゃなくて名古屋空港だから楽チンだわーい('A`)メンドクセみたいな感じです。
IPNuts導入とか、たまってる更新作業とか、つくりかけたままのプログラムとか、家でやりたい事が山積してるんですが、最近家にあんまり帰ってないせいで全然進まない。
いや、忙しいって雰囲気でもないんですが、やっぱり忙しいような。
あれれ、おかしいな。
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 : }
§ Neorbessuts [バッグ サイトc..]
§ スーパーコピーブランド時計N級品 [日本的な人気と信頼を得ています。 安心、安全にお届けします 価格、品質、自信のある商品を取り揃えておりますので、 当..]