2013年10月8日火曜日

Alt+SpaceでIMEを切り替える

リビングで使ってるiMacがUSキーボードでIMEの切り替えは、Command+Spaceで行っているので、他のWindowsPCもAlt+SpaceでIMEの切り替えが出来るるように変更する。

適当にググったらCmdSpaceというユーティリティがヒットした。
が、64bitでは動作しない模様。
ふつうにキーフックしてるだけのようなので、自分で作ってみた。(汗)
が、EmEditor上でフック出来ない…。orz
こんなことに1時間以上使うのはアレなんで、もう1回ググったら、AutoHotKeyというユーティリティを発見した。

しかも設定も簡単、インストールしたら、拡張子が 「ahk」というファイルを作りスタートアップに保存。
ファイルの内容は
!Space::vk19
と書くだけ。
折角コードを書いたのでフックのコードだけ残しておく。
 と言っても猫でもわかるプログラミングのサンプルをほぼ丸パクリなんだが。(滝汗)

  1. #include <Windows.h>
  2. #include <Imm.h>
  3. #include <tchar.h>
  4. #include "KeyHook.h"
  5.  
  6. #pragma data_seg("MY_DATA")
  7. HHOOK hMyHook = 0;
  8. #pragma data_seg()
  9.  
  10. HINSTANCE hInst;
  11.  
  12. BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwReason, LPVOID lpReserved)
  13. {
  14. switch (dwReason) {
  15. case DLL_PROCESS_ATTACH:
  16. hInst = hInstDLL;
  17. break;
  18. case DLL_PROCESS_DETACH:
  19. break;
  20. }
  21. return TRUE;
  22. }
  23.  
  24. int SetHook()
  25. {
  26. hMyHook = SetWindowsHookEx(WH_KEYBOARD, MyHookProc, hInst, 0);
  27. if (hMyHook == NULL)
  28. MessageBox(NULL, _T("フック失敗"), _T("CmdSpace64"), MB_OK);
  29.  
  30. return 0;
  31. }
  32.  
  33. int ResetHook()
  34. {
  35. if (UnhookWindowsHookEx(hMyHook) == 0)
  36. MessageBox(NULL, _T("フック解除失敗"), _T("CmdSpace64"), MB_OK);
  37. return 0;
  38. }
  39.  
  40. LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
  41. {
  42. if (nCode < 0)
  43. return CallNextHookEx(hMyHook, nCode, wp, lp);
  44.  
  45. if (nCode==HC_ACTION) {
  46. // ALT + SPACE が押下された場合
  47. if (GetKeyState(VK_MENU) < 0 && wp == VK_SPACE)
  48. {
  49. // キーダウンのみ処理
  50. if ((lp & 0x80000000) == 0)
  51. {
  52. // 最前面のウィンドウを取得
  53. HWND hwndActive = GetForegroundWindow();
  54. // IMEの規定のウィンドウハンドルを取得
  55. HWND hWnd = ImmGetDefaultIMEWnd(hwndActive);
  56. // 入力コンテキストを取得
  57. HIMC hImc = ImmGetContext(hWnd);
  58. // IMEの状態を取得
  59. if (ImmGetOpenStatus(hImc))
  60. {
  61. // IMEを閉じる
  62. ImmSetOpenStatus(hImc, FALSE);
  63. }
  64. else
  65. {
  66. // IMEを開く
  67. ImmSetOpenStatus(hImc, TRUE);
  68. }
  69. // 入力コンテキストを解放
  70. ImmReleaseContext(hWnd, hImc);
  71. }
  72.  
  73. return TRUE;
  74. }
  75. }
  76. return CallNextHookEx(hMyHook, nCode, wp, lp);
  77. }

0 件のコメント:

コメントを投稿