適当にググったらCmdSpaceというユーティリティがヒットした。
が、64bitでは動作しない模様。
ふつうにキーフックしてるだけのようなので、自分で作ってみた。(汗)
が、EmEditor上でフック出来ない…。orz
こんなことに1時間以上使うのはアレなんで、もう1回ググったら、AutoHotKeyというユーティリティを発見した。
しかも設定も簡単、インストールしたら、拡張子が 「ahk」というファイルを作りスタートアップに保存。
ファイルの内容は
!Space::vk19と書くだけ。
折角コードを書いたのでフックのコードだけ残しておく。
と言っても猫でもわかるプログラミングのサンプルをほぼ丸パクリなんだが。(滝汗)
#include <Windows.h>
#include <Imm.h>
#include <tchar.h>
#include "KeyHook.h"
#pragma data_seg("MY_DATA")
HHOOK hMyHook = 0;
#pragma data_seg()
HINSTANCE hInst;
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason) {
case DLL_PROCESS_ATTACH:
hInst = hInstDLL;
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int SetHook()
{
hMyHook = SetWindowsHookEx(WH_KEYBOARD, MyHookProc, hInst, 0);
if (hMyHook == NULL)
MessageBox(NULL, _T("フック失敗"), _T("CmdSpace64"), MB_OK);
return 0;
}
int ResetHook()
{
if (UnhookWindowsHookEx(hMyHook) == 0)
MessageBox(NULL, _T("フック解除失敗"), _T("CmdSpace64"), MB_OK);
return 0;
}
LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
{
if (nCode < 0)
return CallNextHookEx(hMyHook, nCode, wp, lp);
if (nCode==HC_ACTION) {
// ALT + SPACE が押下された場合
if (GetKeyState(VK_MENU) < 0 && wp == VK_SPACE)
{
// キーダウンのみ処理
if ((lp & 0x80000000) == 0)
{
// 最前面のウィンドウを取得
HWND hwndActive = GetForegroundWindow();
// IMEの規定のウィンドウハンドルを取得
HWND hWnd = ImmGetDefaultIMEWnd(hwndActive);
// 入力コンテキストを取得
HIMC hImc = ImmGetContext(hWnd);
// IMEの状態を取得
if (ImmGetOpenStatus(hImc))
{
// IMEを閉じる
ImmSetOpenStatus(hImc, FALSE);
}
else
{
// IMEを開く
ImmSetOpenStatus(hImc, TRUE);
}
// 入力コンテキストを解放
ImmReleaseContext(hWnd, hImc);
}
return TRUE;
}
}
return CallNextHookEx(hMyHook, nCode, wp, lp);
}
0 件のコメント:
コメントを投稿