Проблема с функцией SetWindowsHookEx на VB.NET под Windows Mobile.
Код написанный на Visual C++ работает на WM 5 без проблем, код на VB.NET под Win32 тоже летает. А вот именно на VB.NET для WM 6 - не пашет хоть плачь ))
Вот кусок кода:
C++
------------------------------------------------------------
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
static _SetWindowsHookExW SetWindowsHookEx;
static _UnhookWindowsHookEx UnhookWindowsHookEx;
static _CallNextHookEx CallNextHookEx;
#define WH_KEYBOARD_LL 20
HINSTANCE g_hHookApiDLL;//Coredll handle
HHOOK g_hInstalledLLKBDhook;//Hook Handle
BOOL StartHooking(HINSTANCE hInstance, HOOKPROC HPCallback)
{
SetWindowsHookEx = NULL;
CallNextHookEx = NULL;
UnhookWindowsHookEx = NULL;
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
if(g_hHookApiDLL == NULL) { return FALSE; }
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
if(SetWindowsHookEx == NULL) { return FALSE; }
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, HPCallback, hInstance, 0);
if(g_hInstalledLLKBDhook == NULL) { return FALSE; }
CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
if(CallNextHookEx == NULL) { return FALSE; }
UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
if(UnhookWindowsHookEx == NULL) { return FALSE; }
return TRUE;
}
------------------------------------------------------------------------
Всё замечательно работает, хуки ловятся.
Теперь пытаюсь отпортировать это дело на VB.NET, сразу возникает проблема в получении hInstance на Windows Mobile - функция Marshal.GetHINSTANCE, работающая в Win32, вообще не входит в класс Marshal для Windows Mobile .Net .
Попытался заменить её на функцию GetModuleHandle, хэндл получаю (правда проверить правильный ли он не могу).
В итоге прохожу к тому что функция SetWindowsHookEx возвращает 0 (ошибка). В С++ проекте эта же функция возвращала 1.
VB.NET
------------------------------------------------------------------------------
Delegate Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Private Const WH_KEYBOARD As Int32 = 2
Private Const WH_KEYBOARD_LL As Int32 = 13
Protected GlobalKeybHook As Integer = 0
Protected Structure KBDLLHOOKSTRUCT
Public vkCode As Integer
Public scanCode As Integer
Public flags As Integer
Public time As Integer
Public dwExtraInfo As Integer
End Structure
<DllImport("coredll.dll", CharSet:=CharSet.Auto)> _
Public Overloads Shared Function SetWindowsHookEx _
(ByVal idHook As Integer, ByVal HookProc As CallBack, _
ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
End Function
<DllImport("coredll.dll", CharSet:=CharSet.Auto)> _
Public Overloads Shared Function GetModuleHandle(ByVal moduleName As Integer) As IntPtr
End Function
Protected Function HookProcKeyb(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Dim m As KBDLLHOOKSTRUCT = Marshal.PtrToStructure(lParam, GetType(KBDLLHOOKSTRUCT))
If wParam = WM_KEYDOWN Then
Microsoft.VisualBasic.Interaction.Beep()
End If
Return CallNextHookEx(GlobalKeybHook, nCode, wParam, lParam)
End Function
Dim hInstance As IntPtr
hInstance = GetModuleHandle(0)
GlobalKeybHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf HookProcKeyb, hInstance, 0) '<<------- Возвращает 0
-----------------------------------------------------------------------------
Пробовал менять на :
<DllImport("coredll.dll", CharSet:=CharSet.Auto)> _
Public Overloads Shared Function GetModuleHandle(ByVal moduleName As String) As IntPtr
End Function
Dim hInstance As IntPtr
hInstance = GetModuleHandle("coredll.dll")
не помогает.
Люди помогите хоть направление поиска ошибки определить !!!! сижу уже второй день как баран перед новыми воротами !