by NoWest » 2005年8月22日(月) 12:09
> 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イベント常にメッセージが送信されてくる状態になって
ヒドイ目に合いました。(笑
[quote]> DLLを修正しましたが、ウィンドウ内でも受信出来なくなりました。
> というか、DLL内の"PostMessage(pData[1], WM_MusKeyMOVE, 0, 0)"行は通っていません。
> ひょっとして前回書いて頂いたコールバックスレッドを使用するのでしょうか?
>
>
> 宜しくお願いします。[/quote]
すみません、私のミスです。
私はマウスフックでやっているんですが、KICO様はメッセージフックを
使っているから動かないのは当然です。
全体を修正しないから間違うんですね。
とりあえず、以下で私の方では動作を確認しました。
[code]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
[/code]
Beep()で動作確認していたんですが、
WM_MOUSEMOVEイベント常にメッセージが送信されてくる状態になって
ヒドイ目に合いました。(笑