自分のアプリにメッセージ送信するには?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
KICO

自分のアプリにメッセージ送信するには?

#1 投稿記事 by KICO »

何時も、お世話に成っています。

システムフックで、マウス関連情報を自分のアプリケーションに送りたいのですが、
PostMessage()の場合、カーソルがボタン上にある時以外受信出来ません。
又、非アクティブの場合どの様にすれば良いのでしょうか?

メッセージループに組み込む方法が解りません。


宜しくお願いします。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 自分のアプリにメッセージ送信するには?

#2 投稿記事 by NoWest »

> 何時も、お世話に成っています。
>
> システムフックで、マウス関連情報を自分のアプリケーションに送りたいのですが、
システムフックがどんなんだったかうる覚えですが、
フックハンドルをメモリマップドファイルなどを使って
ちゃんと保存しないといけないヤツでしたっけ?
> PostMessage()の場合、カーソルがボタン上にある時以外受信出来ません。
> 又、非アクティブの場合どの様にすれば良いのでしょうか?
>
> メッセージループに組み込む方法が解りません。
「カーソルがボタン上にある時以外受信出来ません。」
というのがちょっと分かりません。
もう少し詳しく状況を書いていただけますか。

あと、PostMessageはアクティブだろうが非アクティブでだろうが
メッセージを送信できたと思いますよ。

他にもSendMessageというのもありますが、
SendMessageとPostMessageは動作が微妙に異なります。

SendMessage::「ウィンドウ」にメッセージを送信。
PostMessage::「ウィンドウが属するスレッド」にメッセージを送信。
ゲスト

Re: 自分のアプリにメッセージ送信するには?

#3 投稿記事 by ゲスト »

NoWest様、何時もありがとう御座います。
>システムフックがどんなんだったかうる覚えですが、
> フックハンドルをメモリマップドファイルなどを使って
> ちゃんと保存しないといけないヤツでしたっけ?
フックハンドルは、グローバル変数に入れているだけで、ファイルマッピングはしていません。
DLLは、初めてなのでそういった事も含めて教えて下さい。
>「カーソルがボタン上にある時以外受信出来ません。」
>というのがちょっと分かりません。
>もう少し詳しく状況を書いていただけますか。
クライアントエリア(自のアプリ)内でマウスを移動しても、カーソルがボタン上にある時は受信出来ますが、
スタティク等の上にある時は受信出来ません。

クライアントエリア外の時も受信したいのですが。


宜しくお願いします。
KICO

Re: 自分のアプリにメッセージ送信するには?

#4 投稿記事 by KICO »

前回(2005年08月18日(木) 15:58)のゲストは、私(KICO)です。
入力するのを忘れてしまい、失礼しました。
>クライアントエリア内でマウスを移動しても、カーソルがボタン上にある時は受信出来ますが、
>スタティク等の上にある時は受信出来ません。
上記の状況は現況を書いたもので、ウィンドウ内で「マウスが移動した」等は、
WM_NCHITTEST、WM_NCMOUSEMOVEでメッセージを受信出来るという事は解っているのですが、
「ウィンドウ外」「最小化してウィンドウが無い」とか非アクティブの場合でもマウスメッセージを受信したくて
システムフック(DLL)したのですがウマクいきません。


宜しくお願いします。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 自分のアプリにメッセージ送信するには?

#5 投稿記事 by NoWest »

> WM_NCHITTEST、WM_NCMOUSEMOVEでメッセージを受信出来るという事は解っているのですが、
> 「ウィンドウ外」「最小化してウィンドウが無い」とか非アクティブの場合でもマウスメッセージを受信したくて
> システムフック(DLL)したのですがウマクいきません。
>

こちらでも確認しましたが、確かに非アクティブの状態のウィンドウにメッセージを送れませんね。

ん~こればっかりは私にもよく分からないですが、
メッセージを受け取る方にもローカルフックをかけてみるのはどうでしょうか?

もしくはメッセージ受信用のスレッドを作成する方法もあるかもしれません。

コード: 全て選択

Dim id As DWord
Sub Thread(Param As VoidPtr)
	Dim msg As MSG
	Do
		PostThreadMessage(id,WM_APP,0,0)
		If PeekMessage(msg,0,0,0,PM_REMOVE)=TRUE Then Exit Do
		Sleep(0)
	Loop
	While GetMessage(msg,0,0,0)
		Select Case msg.message
			Case WM_USER+1
				MessageBeep(MB_ICONEXCLAMATION)
		End Select
	Wend
End Sub
DLL内からPostThreadMessage()でメッセージを送信すればいいんですが
少しわかり難いですかね?(こういうのをコールバックスレッドといいます。)

あと、調べる時の参考にしたいのでフック部分のソースを乗っけて頂けませんか?
私の考えているイメージと少しずれているかも知れませんので。。。
KICO

Re: 自分のアプリにメッセージ送信するには?

#6 投稿記事 by KICO »

NoWest様、ありがとう御座います。
>メッセージを受け取る方にもローカルフックをかけてみるのはどうでしょうか?
ローカルフックでは、アクティブ状態でも受信出来ませんでした。

>DLL内からPostThreadMessage()でメッセージを送信すればいいんですが
>少しわかり難いですかね?(こういうのをコールバックスレッドといいます。)
コールバックスレッドの事を、詳しく教えて下さい。

>あと、調べる時の参考にしたいのでフック部分のソースを乗っけて頂けませんか?
>私の考えているイメージと少しずれているかも知れませんので。。。

コード: 全て選択

'-----------------------------------------------------------------------------
	'System Hookの開始用
	Declare Function StartHook Lib "GetStatusMK" (hWnd As DWord) As Long

	'System Hookの終了用
	Declare Function EndHook Lib "GetStatusMK" () As Long
'-----------------------------------------------------------------------------

[GetStatusMK.dll]

#include "GetStatusMK.idx"

'-------------------------------------------------------------------
' メモ - このファイルには、DLLの構成要素を記述します。
'        (例:関数定義、グローバル変数、定数定義など)
'
'        エクスポートが必要な関数には、"Export" 修飾子を指定します。
'        (例:Function Export FuncName() As Long)
'-------------------------------------------------------------------
	'フックをインストールする関数の宣言
	Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
					(idHook As DWord,_	  'インストールするフックの種類
					 lpfn As DWord,_		'インストールするフック関数のアドレス
					 hMod As DWord,_		'インスタンスハンドル
					 dwThreadId As DWord_   'カレントスレッドID
					) As DWord              '戻り値は、フックハンドル

	'フックをアンインストールする関数の宣言
	Declare Function UnhookWindowsHookEx Lib "user32" (hHook As DWord) As DWord

	'次のフックを呼び出す関数の宣言
	Declare Function CallNextHookEx Lib "user32" _
					(hHook As DWord, nCode As Long, wParam As DWord, lParam As DWord) As DWord


	Dim hHook   As DWord	           'Hook Handle
	Dim hInst   As DWord	           'Instanc Handle
	Dim hAppWnd As DWord	           'Application Window Handle
 
	Const WH_GETMESSAGE = 3         'フックの種類を示す定数
	Const HC_ACTION     = 0

	Const WM_MusKeyMOVE = (WM_APP+1)

'-----------------------------------------------------------------------------
Function Export DllMain(hinstDLL As DWord, fdwReason As DWord, lpvReserved As VoidPtr) As Long
	'DLLエントリポイント
	Select Case fdwReason
		Case DLL_PROCESS_ATTACH
			'DLLがプロセス空間にロードされた時に実行されます。
			_System_StartupProgram()
			DllMain=1
			hInst=hinstDLL
	End Select
End Function


Function Export StartHook(hWnd As DWord) As Long
	'Hookのインストール
	hHook=SetWindowsHookEx(WH_GETMESSAGE, AddressOf(GetMsgProc), hInst, 0)
	hAppWnd=hWnd
	If hHook=0 Then StartHook=-1
End Function


Function Export EndHook() As Long
	'Hookのアンインストール
	If hHook Then UnhookWindowsHookEx(hHook) Else EndHook=-1
End Function


Function GetMsgProc(code As Long, wParam As DWord, lParam As DWord) As DWord
	Dim msg	  As *MSG
	Dim a		As Byte
	Dim f		As Long
'Dim c		As Long

	Select Case code
		Case HC_ACTION
		msg=lParam
		Select Case msg->message
			Case WM_NCHITTEST
				a=1
			Case WM_MOUSEMOVE
				a=1
			Case WM_NCMOUSEMOVE
				a=1
			Case WM_MOUSEWHEEL
				a=2
			Case WM_RBUTTONDOWN
				a=3
			Case WM_LBUTTONDOWN
				a=4
			Case WM_MBUTTONDOWN
				a=5
			Case WM_RBUTTONUP
				a=6
			Case WM_LBUTTONUP
				a=7
			Case WM_MBUTTONUP
				a=8
			Case WM_KEYUP
				a=10
				'c=msg->wParam	'c:VK_xxxxx
			Case WM_KEYDOWN
				a=11
				'c=msg->wParam	'c:VK_xxxxx
		End Select
		If a Then
			SendMessage(hAppWnd, WM_MusKeyMOVE, 0, 0)

			'CallNextHookEx(hHook,code,wParam,lParam)
			'GetMsgProc=1
			'Exit Function
		End If
	End Select

	'次のフックを呼び出す
	GetMsgProc = CallNextHookEx(hHook,code,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
AB Ver3.13 です。

宜しくお願いします。
ゲスト

Re: 自分のアプリにメッセージ送信するには?

#7 投稿記事 by ゲスト »

> NoWest様、ありがとう御座います。
> ローカルフックでは、アクティブ状態でも受信出来ませんでした。
原因が分かりましたのでソースを改良してみました。

コード: 全て選択

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (idHook As DWord, lpfn As DWord,hMod As DWord, dwThreadId As DWord) As DWord
Declare Function UnhookWindowsHookEx Lib "user32" (hHook As DWord) As DWord 
Declare Function CallNextHookEx Lib "user32" (hHook As DWord, nCode As Long, wParam As DWord, lParam As DWord) As DWord

Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (hFile As HANDLE, ByRef lpFileMappingAttributes As SECURITY_ATTRIBUTES, flProtect As DWord, dwMaximumSizeHigh As DWord, dwMaximumSizeLow As DWord, lpName As BytePtr) As HANDLE
Declare Function MapViewOfFile Lib "kernel32" (hFileMappingObject As HANDLE, dwDesiredAccess As DWord, dwFileOffsetHigh As DWord, dwFileOffsetLow As DWord, dwNumberOfBytesToMap As DWord) As VoidPtr
Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As VoidPtr) As Long

Dim hMF As HANDLE
Dim pData As *DWord
Dim hInst As DWord

Const WM_MusKeyMOVE = (WM_USER+1)

Function Export DllMain(hinstDLL As DWord, fdwReason As DWord, lpvReserved As VoidPtr) As Long
	'DLLエントリポイント
	Select Case fdwReason
		Case DLL_PROCESS_ATTACH
			'DLLがプロセス空間にロードされた時に実行されます。
			_System_StartupProgram()
			DllMain=1
			hInst=hinstDLL

			'メモリマップトファイルを作成
			hMF=CreateFileMapping(-1,ByVal NULL,PAGE_READWRITE,0,(4*8)*2,"Mouse Hook Test DLL")
			pData=MapViewOfFile(hMF,FILE_MAP_ALL_ACCESS,0,0,0)
		Case DLL_PROCESS_DETACH
			'DLLがプロセス空間から解除された時に実行されます。
			'メモリマップトファイルを破棄
			UnmapViewOfFile(pData)
			CloseHandle(hMF)
	End Select
 End Function

Function Export StartHook(hWnd As DWord) As Long
	'Hookのインストール
	pData[0]=SetWindowsHookEx(WH_GETMESSAGE, AddressOf(GetMsgProc), hInst, 0)
	pData[1]=hWnd
	If pData[0]=0 Then StartHook=-1
End Function
 
 
Function Export EndHook() As Long
	'Hookのアンインストール
	If pData[0] Then UnhookWindowsHookEx(pData[0]) Else EndHook=-1
End Function

Function GetMsgProc(code As Long, wParam As DWord, lParam As DWord) As DWord
	Dim msg	  As *MSG
	Dim a		As Byte
	Dim f		As Long
	'Dim c		As Long
	Select Case code
		Case HC_ACTION
		msg=lParam
		Select Case msg->message
			Case WM_NCHITTEST
				a=1
			Case WM_MOUSEMOVE
				a=1
			Case WM_NCMOUSEMOVE
				a=1
			Case WM_MOUSEWHEEL
				a=2
			Case WM_RBUTTONDOWN
				a=3
			Case WM_LBUTTONDOWN
				a=4
			Case WM_MBUTTONDOWN
				a=5
			Case WM_RBUTTONUP
				a=6
			Case WM_LBUTTONUP
				a=7
			Case WM_MBUTTONUP
				a=8
			Case WM_KEYUP
				a=10
				'c=msg->wParam	'c:VK_xxxxx
			Case WM_KEYDOWN
				a=11
				'c=msg->wParam	'c:VK_xxxxx
		End Select
		If a Then
			PostMessage(pData[1],WM_MusKeyMOVE,0,0)

			'CallNextHookEx(pData[0],code,wParam,lParam)
			'GetMsgProc=1
			'Exit Function
		End If
	End Select
	'次のフックを呼び出す
	GetMsgProc = CallNextHookEx(pData[0],code,wParam,lParam)
End Function

私も勘違いしていたんですが、
フックハンドルだけを共有化してもダメだったですよね。
メッセージの送信先のウィンドウハンドルもDLL間で共有化する必要があったんです。

多分これで動くと思います。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 自分のアプリにメッセージ送信するには?

#8 投稿記事 by NoWest »



すいません。私です。
KICO

Re: 自分のアプリにメッセージ送信するには?

#9 投稿記事 by KICO »

NoWest様、ありがとう御座います。
> ローカルフックでは、アクティブ状態でも受信出来ませんでした。

>> 原因が分かりましたのでソースを改良してみました。

>> フックハンドルだけを共有化してもダメだったですよね。
>> メッセージの送信先のウィンドウハンドルもDLL間で共有化する必要があったんです。
ローカルフックは、頂いたコードで受信出来またが、カーソルが自アプリのウィンドウ外では、まだ受信出来ません。

前回、頂いたコールバックスレッドの使い方が解りません。

宜しくお願いします。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 自分のアプリにメッセージ送信するには?

#10 投稿記事 by NoWest »

> NoWest様、ありがとう御座います。
> ローカルフックは、頂いたコードで受信出来またが、カーソルが自アプリのウィンドウ外では、まだ受信出来ません。

肝心な部分を修正していませんでした。

コード: 全て選択

Type MOUSEHOOKSTRUCT
    pt As POINTAPI
    hwnd As HWND
    wHitTestCode As DWord
    dwExtraInfo As DWord
End Type

Function GetMsgProc(code As Long, wParam As DWord, lParam As DWord) As DWord
    Dim pmh As *MOUSEHOOKSTRUCT
    Dim a        As Byte
    Dim f        As Long
    'Dim c        As Long
    pmh=lParam
    If Code<0 Then
        GetMsgProc=CallNextHookEx(pData[0],nCode,wParam,lParam)
        Exit Function
    End If
    Select Case wParam
        Case WM_NCHITTEST
                a=1
            Case WM_MOUSEMOVE
                a=1
            Case WM_NCMOUSEMOVE
                a=1
            Case WM_MOUSEWHEEL
                a=2
            Case WM_RBUTTONDOWN
                a=3
            Case WM_LBUTTONDOWN
                a=4
            Case WM_MBUTTONDOWN
                a=5
            Case WM_RBUTTONUP
                a=6
            Case WM_LBUTTONUP
                a=7
            Case WM_MBUTTONUP
                a=8
        End Select
        If a Then
            PostMessage(pData[1],WM_MusKeyMOVE,0,0)

            'CallNextHookEx(pData[0],code,wParam,lParam)
            'GetMsgProc=1
            'Exit Function
        End If
    End Select
    '次のフックを呼び出す
    GetMsgProc = CallNextHookEx(pData[0],code,wParam,lParam)
End Function
> 前回、頂いたコールバックスレッドの使い方が解りません。
>
> 宜しくお願いします。
今回、特に必要ということな無いのですが
知っていて損はありません。

コールバックスレッドというのは
スレッドに対してメッセージを送信して
そのメッセージに応じてスレッド内で制御しようというものです。

あんまり実践例が無いので難しそうですが
やってみると以外に簡単です。

ということでクラスモジュール化してみました。

コード: 全て選択


Class CCallbackThread
Public
	m_idThread As DWord
	Sub CCallbackThread()
		m_hThread=CreateThread(ByVal NULL,0,AddressOf(ThreadProc),VarPtr(This),0,VarPtr(m_idThread))
	End Sub
	Sub ~CCallbackThread()
		Dim ExitCode As Long
		Do
			SendMsg(WM_QUIT,0,0)
			GetExitCodeThread(m_hThread,VarPtr(ExitCode))
			Sleep(0)
		Loop While ExitCode=STILL_ACTIVE
		CloseHandle(m_hThread)
	End Sub
	Function SendMsg(dwMsg As DWord, wParam As DWord, lParam As DWord) As Long
		SendMsg=PostThreadMessage(m_idThread,dwMsg,wParam,lParam)
	End Function
Private
	m_hThread As HANDLE
	Sub ThreadProc()
		Dim msg As MSG
		Do
			PostThreadMessage(m_idThread,WM_USER,0,0)
			If PeekMessage(msg,0,0,0,PM_NOREMOVE)=TRUE Then Exit Do
			Sleep(0)
		Loop
		While GetMessage(msg,0,0,0)
			Select Case msg.message
				Case -1,0
					Exit While
				Case ...
					'メッセージに対する処理
				Case ....
				Case .....
			End Select
		Wend
		ExitThread(&HE0F)
	End Sub
End Class
コールバックスレッドの構造は
ウィンドウプログラミングにおけるメッセージループに似ています。
GetMessage()、PeekMessage()など見慣れた関数がありますよね。

このコールバックスレッドを用いる利点は
通常の∞ループで処理するスレッドと異なり、
メッセージが送信されてくるまで
GetMessage()関数によってスレッドが待機することです。

このような機能をスレッド関連のAPIで実装するのは大変ですが
このようにメッセージ関連のAPIで組めば簡単です。

使い方なんですが

コード: 全て選択

While GetMessage(msg,0,0,0)
	Select Case msg.message
		Case -1,0
			Exit While
		Case WM_USER+1
			Beep(440,100)
	End Select
Wend
こんな風にスレッド内をしておき

コード: 全て選択

Dim ct As CCallbckThread

ct.SendMsg(WM_USER+1,0,0)
こういう風にスレッドにメッセージを送ります。
KICO

Re: 自分のアプリにメッセージ送信するには?

#11 投稿記事 by KICO »

NoWest様、ありがとう御座います。
>やっぱり、私のイメージと少し違いましたね。
タイトルを「マウス及びキーのグローバル監視」と、しておけば良かったですかネェ?

グローバルフックにすれば、ウィンドウ内は勿論、デスクトップ領域や他のアプリケーション使用中でも
フック出来ているので、後は情報が欲しいウィンドウに送信すれば良いと思ったものですから、この様なタイトルにしたのです。


コールバックスレッドについて説明して頂きましてありがとう御座います。
今後の参考にさせて頂きます。
まだ私は、バージョン3.13 を使用しているものですからクラス関係の事は、まったく解りませんが勉強します。(ガンバ×2 (^_^;)←自分に)

<デスクトップ領域のマウスフックの方法があれば誰か教えてください。
宜しくお願いします。
KICO

Re: 自分のアプリにメッセージ送信するには?

#12 投稿記事 by KICO »

DLLを修正しましたが、ウィンドウ内でも受信出来なくなりました。
というか、DLL内の"PostMessage(pData[1], WM_MusKeyMOVE, 0, 0)"行は通っていません。

ひょっとして前回書いて頂いたコールバックスレッドを使用するのでしょうか?


宜しくお願いします。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 自分のアプリにメッセージ送信するには?

#13 投稿記事 by NoWest »

> DLLを修正しましたが、ウィンドウ内でも受信出来なくなりました。
> というか、DLL内の"PostMessage(pData[1], WM_MusKeyMOVE, 0, 0)"行は通っていません。

> ひょっとして前回書いて頂いたコールバックスレッドを使用するのでしょうか?
>
>
> 宜しくお願いします。

すみません、私のミスです。
私はマウスフックでやっているんですが、KICO様はメッセージフックを
使っているから動かないのは当然です。

全体を修正しないから間違うんですね。

とりあえず、以下で私の方では動作を確認しました。

コード: 全て選択

Type MOUSEHOOKSTRUCT
    pt As POINTAPI
    hwnd As HWND
    wHitTestCode As DWord
    dwExtraInfo As DWord
End Type

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (idHook As DWord, lpfn As DWord,hMod As DWord, dwThreadId As DWord) As DWord
Declare Function UnhookWindowsHookEx Lib "user32" (hHook As DWord) As DWord 
Declare Function CallNextHookEx Lib "user32" (hHook As DWord, nCode As Long, wParam As DWord, lParam As DWord) As DWord

Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (hFile As HANDLE, ByRef lpFileMappingAttributes As SECURITY_ATTRIBUTES, flProtect As DWord, dwMaximumSizeHigh As DWord, dwMaximumSizeLow As DWord, lpName As BytePtr) As HANDLE
Declare Function MapViewOfFile Lib "kernel32" (hFileMappingObject As HANDLE, dwDesiredAccess As DWord, dwFileOffsetHigh As DWord, dwFileOffsetLow As DWord, dwNumberOfBytesToMap As DWord) As VoidPtr
Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As VoidPtr) As Long


Dim hMF As HANDLE
Dim pData As *DWord
Dim hInst As DWord

Const WM_MusKeyMOVE = (WM_USER+1)

Function Export DllMain(hinstDLL As DWord, fdwReason As DWord, lpvReserved As VoidPtr) As Long
    'DLLエントリポイント
    Select Case fdwReason
        Case DLL_PROCESS_ATTACH
            'DLLがプロセス空間にロードされた時に実行されます。
            _System_StartupProgram()
            DllMain=1
            hInst=hinstDLL

            'メモリマップトファイルを作成
            hMF=CreateFileMapping(-1,ByVal NULL,PAGE_READWRITE,0,(4*8)*2,"Mouse Hook Test DLL")
            pData=MapViewOfFile(hMF,FILE_MAP_ALL_ACCESS,0,0,0)
        Case DLL_PROCESS_DETACH
            'DLLがプロセス空間から解除された時に実行されます。
            'メモリマップトファイルを破棄
            UnmapViewOfFile(pData)
            CloseHandle(hMF)
    End Select
 End Function

Function Export StartHook(hWnd As DWord) As Long
    'Hookのインストール
    pData[0]=SetWindowsHookEx(WH_MOUSE, AddressOf(GetMsgProc), hInst, 0)
    pData[1]=hWnd
    If pData[0]=0 Then StartHook=-1
End Function
 
 Function Export EndHook() As Long
    'Hookのアンインストール
    If pData[0] Then UnhookWindowsHookEx(pData[0]) Else EndHook=-1
End Function

Function GetMsgProc(code As Long, wParam As DWord, lParam As DWord) As DWord
    Dim pmh As *MOUSEHOOKSTRUCT
    Dim a        As Byte
    Dim f        As Long
    'Dim c        As Long
    pmh=lParam
    If code<0 Then
        GetMsgProc=CallNextHookEx(pData[0],code,wParam,lParam)
        Exit Function
    End If
    Select Case wParam
        Case WM_NCHITTEST
        a=1
        Case WM_MOUSEMOVE
            a=1
        Case WM_NCMOUSEMOVE
            a=1
        Case WM_MOUSEWHEEL
            a=2
        Case WM_RBUTTONDOWN
            a=3
        Case WM_LBUTTONDOWN
            a=4
        Case WM_MBUTTONDOWN
            a=5
        Case WM_RBUTTONUP
            a=6
        Case WM_LBUTTONUP
            a=7
        Case WM_MBUTTONUP
            a=8
    End Select
    If a Then
        PostMessage(pData[1],WM_MusKeyMOVE,0,0)
        Exit Function
        'CallNextHookEx(pData[0],code,wParam,lParam)
        'GetMsgProc=1
        'Exit Function
    End If
    '次のフックを呼び出す
    GetMsgProc = CallNextHookEx(pData[0],code,wParam,lParam)
End Function
Beep()で動作確認していたんですが、
WM_MOUSEMOVEイベント常にメッセージが送信されてくる状態になって
ヒドイ目に合いました。(笑
KICO

Re: 自分のアプリにメッセージ送信するには?

#14 投稿記事 by KICO »

NoWest様、連日ありがとう御座います。

AB Ver3.13 なものですから、"Dim pData As *DWord"とか使えないので、"Dim pData[1] As DWord"にしましたが、"pData=MapViewOfFile(hMF,FILE_MAP_ALL_ACCESS,0,0,0)"との関係でマズイですか?
> Beep()で動作確認していたんですが、
> WM_MOUSEMOVEイベント常にメッセージが送信されてくる状態になって
> ヒドイ目に合いました。(笑
御手数かけまして、申し訳御座いません。(-_-;)


宜しくお願いします。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 自分のアプリにメッセージ送信するには?

#15 投稿記事 by NoWest »

> NoWest様、連日ありがとう御座います。
>
> AB Ver3.13 なものですから、"Dim pData As *DWord"とか使えないので、
そういえばAB3には*DWordは使えませんでしたね。忘れていました。

AB3では代わりDWordPtrを使ってください。

コード: 全て選択

Dim pData As DWordPtr
"Dim pData[1] As DWord"にしましたが、
"pData=MapViewOfFile(hMF,FILE_MAP_ALL_ACCESS,0,0,0)"との
関係でマズイですか?
はい、マズイです。

というのもMapViewOfFileの戻り値はアドレスだからです。
アドレスを格納するのはポインタ変数というお約束です。
ポインタ変数を使うことでメモリへのデータの書き込みが
あたかも配列のように行えるようになります。

例えば以下のコードは同じことをしています。
細かいことはヘルプのキーワード検索とかで
関数を調べると分かると思います。

コード: 全て選択

Dim p As DWord
p=malloc(4*2)
SetDWord[p,123]
SetDWord[p+4,456]
Print GetDWord(p)
Print GetDWord(p+4)
free(p)

コード: 全て選択

Dim p As DWordPtr
p=malloc(4*2)
p[0]=123
p[1]=456
Print p[0]
Print p[1]
free(p)
返信する