Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с функцией SetWindowsHookEx на VB.NET под Windows Mobile.

44K
07 декабря 2008 года
TenBaseT
1 / / 07.12.2008
Пишу перехватчик клавиатуры на 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")

не помогает.

Люди помогите хоть направление поиска ошибки определить !!!! сижу уже второй день как баран перед новыми воротами !
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог