締切済み

VC++&グローバルフックについて質問です

  • すぐに回答を!
  • 質問No.5371433
  • 閲覧数1055
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 50% (1/2)

vc++2008,Windows Vistaの環境でプログラムを作成しています。
以下、aが押されたら、設定したhWndにWM_KEYDOWN,VK_LEFTのメッセージを送るプログラムのつもりで書きました。
http://www.shos.info/develop/cwin/tipswin.html#windows008
を参考にしています。
しかし、dllにしてWinMainで呼び出したのですが動作しません。
エラーも出ないのでなぜ動かないのかがわかりません。

このプログラムをちゃんと動かすにはどうしたらいいでしょうか。

どうかご指摘ください。よろしくお願いします。
//hook.h
#ifdefHOOKAPI

#else

#define HOOKAPIextern "C"__declspec(dllimport)

#endif

HOOKAPI HINSTANCE _hInstance;
HOOKAPI HHOOK _hHook;
HOOKAPI HWND _hWnd;

HOOKAPIBOOL Set(HWND hWnd);

HOOKAPI void Reset();

//hook.cpp
#include <windows.h>

#define HOOKAPI extern "C" __declspec(dllexport)

#include "hook.h"

#pragma data_seg(".share")

HHOOK _hHook = NULL;
HWND _hWnd = NULL;
HINSTANCE _hInstance;
#pragma data_seg()

#pragma comment(linker, "/section:.share,rws")


LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
/* ここでは 'A' が押されたら予め設定済みの _hWnd にメッセージを送る */
if (nCode >= 0 && nCode != HC_NOREMOVE && wParam == 'A') {
PostMessage(_hWnd, WM_KEYDOWN, VK_LEFT, 0);
CallNextHookEx(_hHook, nCode, wParam, lParam);
return 1;
}
return CallNextHookEx(_hHook, nCode, wParam, lParam);
}

BOOL Set(HWND hWnd)
{
/* キーのフック */
_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)HookProc, _hInstance, 0);
/* ここで hInstance は DLL のインスタンス ハンドル */
_hWnd = hWnd;
return (_hHook != NULL);
}

void Reset()
{
if (_hHook != NULL) {
UnhookWindowsHookEx(_hHook);
_hHook = NULL;
}
}
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.2

ベストアンサー率 71% (1325/1856)

> しかし、dllにしてWinMainで呼び出したのですが動作しません。
というのは DLL側のHookProcまで来ないということなのか
PostMessageは処理しているが 相手先のWndProcなどのVK_LEFTの処理ルーチンへ来ないのでしょうか

どこまで実行されているのかを明確にしたほうがいいでしょう
また受けて側はダイアログなのか通常Windowなのかは分かりますか?

ダイアログだと ダイアログ内の前処理で矢印キーなのが拾われてしまっている可能性もありますよ
補足コメント
rakukichi

お礼率 50% (1/2)

回答ありがとうございます.

aが押されてもHookProcまで来ないんです.

受け手側は通常Windowです.
投稿日時 - 2009-10-19 08:55:45
OKWAVE 20th Be MORE ありがとうをカタチに
  • 回答No.1

ベストアンサー率 60% (434/720)

 こんばんは。
 以下では無理でしょうか。

static LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION)
{
if(wParam == 'A')
{
::PostMessage(_hWnd, WM_KEYDOWN, VK_LEFT, 0);
return 0;
}
}

return ::CallNextHookEx(_S_ghk.hHook, nCode, wParam, lParam);
}

 後、キーボードのグローバルフックをする場合、ローレベルキーボードフック(WH_KEYBOARD_LLフラグ)を使用すれば、DLLを作成する必要がありませんので、其方の方が手っ取り早くて簡単です。

 http://msdn.microsoft.com/en-us/library/ms644985(VS.85).aspx
お礼コメント
rakukichi

お礼率 50% (1/2)

変えたのですがダメでした...

ローレベルキーボードフックでDLLを作成せずにグローバルフックができるなんて知りませんでした.
勉強してみたいと思います.

回答ありがとうございました.
投稿日時 - 2009-10-19 08:54:40
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ