グローバルフックでマウスのクリックを無視する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ZooU

グローバルフックでマウスのクリックを無視する方法

#1

投稿記事 by ZooU » 9年前

環境:
Windows 7 Ultimate
Visual Studio 2010 Pro

やりたい事:
他のアプリケーションを自動操作するプログラムを作成しようとしています。 このプログラムのプロトタイプは完成し、自動操作中にマウスやキーボートの操作を行わなければ正常に終了します。 
しかし、この自動操作中に手動でカーソルの位置を変えられたり、マウスをクリックされると対象アプリケーションの操作がうまく実行できません。 そのため、マウスの操作をグローバルフックでコントロールしたいと思っています。

問題:
DLLを作成しWH_MOUSEのグローバルフックでマウスの移動やクリックを全てフックする事は出来ました。 しかし、次のようにマウスのメッセージを戻さないためにRETURN TUREでメッセージを削除するのですが、マウスが置かれているWindowと位置によりクリックが無効(これを望んでいます)であったり、有効(削除が効かない)であったりします。  

Outlookはどの位置でもマウス操作が有効
IEはWindow Topのタブは無効、メニューバーも無効、Web内は有効
Desktopのタスクバー内とDesktop内は無効

コード:

LRESULT CALLBACK CKeyboardHook::MouseProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam)
{
	if ( p_nCode < 0 )
		return :: CallNextHookEx( m_hMouseHook, p_nCode, p_wParam, p_lParam );

//    Beep( 440, 200 );  //フックの確認のため

	return TRUE;	// 1 - delete a message from the queue.
//	return FALSE;	// 0 - not delete a message from the queue.
}


static HINSTANCE g_hDllInst = NULL;

HINSTANCE GetThisHInst()
{
	return g_hDllInst;
}

static AFX_EXTENSION_MODULE tGlobalDllDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		g_hDllInst = hInstance;	// この行を追加
	}
	return TRUE;
}

質問:
Q1: マウスのメッセージを削除する方法が間違えているのでしょうか。 もし、そうであれば正しい方法はどのように行うのでしょうか。
Q2: このフックへ渡って来る前に、あるWindowsに対してはマウスの処理は終えているのしょうか。
Q3: 基本的な質問ですが、他のアプリケーションを操作する一般的な方法はどのように行うのでしょうか。

ご指導いただければと思います。 宜しくお願い致します。

“C言語何でも質問掲示板” へ戻る