ページ 1 / 2
自分のアプリにメッセージ送信するには?
Posted: 2005年8月17日(水) 18:31
by KICO
何時も、お世話に成っています。
システムフックで、マウス関連情報を自分のアプリケーションに送りたいのですが、
PostMessage()の場合、カーソルがボタン上にある時以外受信出来ません。
又、非アクティブの場合どの様にすれば良いのでしょうか?
メッセージループに組み込む方法が解りません。
宜しくお願いします。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月18日(木) 14:36
by NoWest
> 何時も、お世話に成っています。
>
> システムフックで、マウス関連情報を自分のアプリケーションに送りたいのですが、
システムフックがどんなんだったかうる覚えですが、
フックハンドルをメモリマップドファイルなどを使って
ちゃんと保存しないといけないヤツでしたっけ?
> PostMessage()の場合、カーソルがボタン上にある時以外受信出来ません。
> 又、非アクティブの場合どの様にすれば良いのでしょうか?
>
> メッセージループに組み込む方法が解りません。
「カーソルがボタン上にある時以外受信出来ません。」
というのがちょっと分かりません。
もう少し詳しく状況を書いていただけますか。
あと、PostMessageはアクティブだろうが非アクティブでだろうが
メッセージを送信できたと思いますよ。
他にもSendMessageというのもありますが、
SendMessageとPostMessageは動作が微妙に異なります。
SendMessage::「ウィンドウ」にメッセージを送信。
PostMessage::「ウィンドウが属するスレッド」にメッセージを送信。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月18日(木) 15:58
by ゲスト
NoWest様、何時もありがとう御座います。
>システムフックがどんなんだったかうる覚えですが、
> フックハンドルをメモリマップドファイルなどを使って
> ちゃんと保存しないといけないヤツでしたっけ?
フックハンドルは、グローバル変数に入れているだけで、ファイルマッピングはしていません。
DLLは、初めてなのでそういった事も含めて教えて下さい。
>「カーソルがボタン上にある時以外受信出来ません。」
>というのがちょっと分かりません。
>もう少し詳しく状況を書いていただけますか。
クライアントエリア(自のアプリ)内でマウスを移動しても、カーソルがボタン上にある時は受信出来ますが、
スタティク等の上にある時は受信出来ません。
クライアントエリア外の時も受信したいのですが。
宜しくお願いします。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月19日(金) 10:25
by KICO
前回(2005年08月18日(木) 15:58)のゲストは、私(KICO)です。
入力するのを忘れてしまい、失礼しました。
>クライアントエリア内でマウスを移動しても、カーソルがボタン上にある時は受信出来ますが、
>スタティク等の上にある時は受信出来ません。
上記の状況は現況を書いたもので、ウィンドウ内で「マウスが移動した」等は、
WM_NCHITTEST、WM_NCMOUSEMOVEでメッセージを受信出来るという事は解っているのですが、
「ウィンドウ外」「最小化してウィンドウが無い」とか非アクティブの場合でもマウスメッセージを受信したくて
システムフック(DLL)したのですがウマクいきません。
宜しくお願いします。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月20日(土) 18:35
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()でメッセージを送信すればいいんですが
少しわかり難いですかね?(こういうのをコールバックスレッドといいます。)
あと、調べる時の参考にしたいのでフック部分のソースを乗っけて頂けませんか?
私の考えているイメージと少しずれているかも知れませんので。。。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月21日(日) 09:40
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: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月21日(日) 11:40
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間で共有化する必要があったんです。
多分これで動くと思います。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月21日(日) 11:42
by NoWest
↑
すいません。私です。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月21日(日) 12:45
by KICO
NoWest様、ありがとう御座います。
> ローカルフックでは、アクティブ状態でも受信出来ませんでした。
>> 原因が分かりましたのでソースを改良してみました。
>> フックハンドルだけを共有化してもダメだったですよね。
>> メッセージの送信先のウィンドウハンドルもDLL間で共有化する必要があったんです。
ローカルフックは、頂いたコードで受信出来またが、カーソルが自アプリのウィンドウ外では、まだ受信出来ません。
前回、頂いたコールバックスレッドの使い方が解りません。
宜しくお願いします。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月21日(日) 13:06
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)
こういう風にスレッドにメッセージを送ります。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月21日(日) 15:44
by KICO
NoWest様、ありがとう御座います。
>やっぱり、私のイメージと少し違いましたね。
タイトルを「マウス及びキーのグローバル監視」と、しておけば良かったですかネェ?
グローバルフックにすれば、ウィンドウ内は勿論、デスクトップ領域や他のアプリケーション使用中でも
フック出来ているので、後は情報が欲しいウィンドウに送信すれば良いと思ったものですから、この様なタイトルにしたのです。
コールバックスレッドについて説明して頂きましてありがとう御座います。
今後の参考にさせて頂きます。
まだ私は、バージョン3.13 を使用しているものですからクラス関係の事は、まったく解りませんが勉強します。(ガンバ×2 (^_^;)←自分に)
<デスクトップ領域のマウスフックの方法があれば誰か教えてください。
宜しくお願いします。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月21日(日) 16:32
by KICO
DLLを修正しましたが、ウィンドウ内でも受信出来なくなりました。
というか、DLL内の"PostMessage(pData[1], WM_MusKeyMOVE, 0, 0)"行は通っていません。
ひょっとして前回書いて頂いたコールバックスレッドを使用するのでしょうか?
宜しくお願いします。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月22日(月) 12:09
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イベント常にメッセージが送信されてくる状態になって
ヒドイ目に合いました。(笑
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月22日(月) 12:36
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イベント常にメッセージが送信されてくる状態になって
> ヒドイ目に合いました。(笑
御手数かけまして、申し訳御座いません。(-_-;)
宜しくお願いします。
Re: 自分のアプリにメッセージ送信するには?
Posted: 2005年8月22日(月) 13: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)