Hi @all,
ich habe ein dickes Prob und keine Ahnung an was das liegen könnte.
Also ich habe mir ein systemweiten Hook in Form einer DLL geschrieben und fange damit verschiedene Mausereignisse ab. Mein Hook funktioniert einwandfrei, jedoch bekomme ich beim drehen des Mausrads als Wert für zDelta immer nur eine 0 zurückgeliefert. Den Wert lese ich aus dem übergebenen wParam mit zDelta = (short)HIWORD(wParam); aus, aber komischerweise bekomme ich da immer eine 0, anstatt 120 für Rad nach vorne bzw. -120 für Rad nach hinten bewegt. Wenn ich mich in meiner Applikation befinde, in der der Hook installiert und verwendet wird, das Fenster, welches die Ereignisse abfängt aktiv ist und ich das Mausrad bewege, bekomme ich die 120 bzw. -120, sobald das Fenster aber inaktiv ist liefert zDelta dann nur noch die 0, was natürlich auf gut deutsch besch..... ist, da ich bestimmen muss, ob das Rad nach vorne oder nach hinten bewegt wurde. An was könnte das denn liegen? Benutze vc++ 6.0 auf Win2k mit SP4.
hier mal meine DLL:
und hier die Applikation, in der ich die Ereignisse abfange:
bin für jegliche Hilfe dankbar
greetz giniman
ich habe ein dickes Prob und keine Ahnung an was das liegen könnte.
Also ich habe mir ein systemweiten Hook in Form einer DLL geschrieben und fange damit verschiedene Mausereignisse ab. Mein Hook funktioniert einwandfrei, jedoch bekomme ich beim drehen des Mausrads als Wert für zDelta immer nur eine 0 zurückgeliefert. Den Wert lese ich aus dem übergebenen wParam mit zDelta = (short)HIWORD(wParam); aus, aber komischerweise bekomme ich da immer eine 0, anstatt 120 für Rad nach vorne bzw. -120 für Rad nach hinten bewegt. Wenn ich mich in meiner Applikation befinde, in der der Hook installiert und verwendet wird, das Fenster, welches die Ereignisse abfängt aktiv ist und ich das Mausrad bewege, bekomme ich die 120 bzw. -120, sobald das Fenster aber inaktiv ist liefert zDelta dann nur noch die 0, was natürlich auf gut deutsch besch..... ist, da ich bestimmen muss, ob das Rad nach vorne oder nach hinten bewegt wurde. An was könnte das denn liegen? Benutze vc++ 6.0 auf Win2k mit SP4.
hier mal meine DLL:
Code:
#include "stdafx.h"
#include "MouseHook.h"
#pragma data_seg(".HOOKDATA")
HHOOK hook = NULL;
HWND hwnd = NULL;
char ClassN[100];
char WTitle[100];
#pragma data_seg()
#pragma comment(linker, "/SECTION:.HOOKDATA,RWS")
MOUSEHOOK_API void InstallHook(HWND h,char *c, char *w)
{
hook = NULL;
hwnd = h;
strcpy(ClassN,c);
strcpy(WTitle,w);
hook = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("MouseHook.dll"), NULL);
if(hook==NULL)
MessageBox(NULL,"Unable to install hook","Error!",MB_OK);
}
MOUSEHOOK_API void RemoveHook()
{
UnhookWindowsHookEx(hook);
}
MOUSEHOOK_API LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode < 0)
return CallNextHookEx(hook, nCode, wParam, lParam);
short zDelta;
TCHAR m_sVal[128];
if(nCode == HC_ACTION)
{
switch (wParam)
{
case WM_LBUTTONDOWN:
case WM_NCLBUTTONDOWN:
PostMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam);
break;
case WM_RBUTTONDOWN:
case WM_NCRBUTTONDOWN:
PostMessage(hwnd, WM_RBUTTONDOWN, wParam, lParam);
break;
case WM_MOUSEWHEEL:
zDelta = (short)HIWORD(wParam);
wsprintf(m_sVal, "%d", zDelta);
MessageBox(NULL,m_sVal,"Mausrad",MB_OK);
PostMessage(hwnd, WM_MOUSEWHEEL, wParam, lParam);
break;
default:
break;
}
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}
und hier die Applikation, in der ich die Ereignisse abfange:
Code:
...
...
void CClientUDP1::OnHook()
{
m_hHookDll = NULL;
m_bStartHook = TRUE;
m_iMouseKey = 0;
InstallHook();
}
void CClientUDP1::InstallHook()
{
if(!LoadHookDll())
{
AfxMessageBox("HookDll konnte nicht geladen werden");
//EndDialog(IDCANCEL);
}
if(!SetHook())
{
AfxMessageBox("Hook konnte nicht eingerichtet werden");
//EndDialog(IDCANCEL);
}
}
BOOL CClientUDP1::LoadHookDll()
{
if(!(m_hHookDll = LoadLibrary("MouseHook.dll")))
return 0;
return 1;
}
typedef void (*SetHookInDll)(HWND hWnd,char *cln, char *wtl);
typedef void (*UnSetHookInDll)();
SetHookInDll SetHookDll;
UnSetHookInDll UnSetHookDll;
BOOL CClientUDP1::SetHook()
{
if(m_hHookDll==NULL)
return 0;
SetHookDll = (SetHookInDll)GetProcAddress(m_hHookDll,"InstallHook");
if(!SetHookDll)
return 0;
SetHookDll(this->GetSafeHwnd(),"CClientUDP1","HapticServer");
return 1;
}
BOOL CClientUDP1::UnSetHook()
{
if(m_hHookDll==0)
return 0;
UnSetHookDll = (UnSetHookInDll)GetProcAddress(m_hHookDll,"RemoveHook");
if(!UnSetHookDll)
return 0;
UnSetHookDll();
return 1;
}
void CClientUDP1::UnLoadHookDll()
{
FreeLibrary(m_hHookDll);
}
LRESULT CClientUDP1::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
short zDelta;
switch(message)
{
case WM_LBUTTONDOWN:
m_iRot = 0;
switch(m_iMouseKey)
{
case 0: //1.Klick auf linke Maustatse: Rotation um die x-Achse
m_iMouseKey = 1;
break;
case 1: //2.Klick auf linke Maustatse: Rotation um die z-Achse
m_iMouseKey = 2;
break;
case 2: //3.Klick auf linke Maustatse: Rotation um die y-Achse
m_iMouseKey = 3;
break;
case 3:
m_iMouseKey = 0;
m_iRotAchse = 0;
break;
default:
break;
}
break;
case WM_RBUTTONDOWN:
AfxMessageBox("Rechte Maustaste wurde gedrückt");
break;
case WM_MOUSEWHEEL:
zDelta = (short)HIWORD(wParam);
wsprintf(m_sVal, "%d", zDelta);
if(m_iMouseKey != 0)
{
if(zDelta > 0)
{
m_bRichtung = TRUE;
//AfxMessageBox(m_sVal);
}
else if(zDelta < 0)
{
m_bRichtung = FALSE;
//AfxMessageBox(m_sVal);
}
else
{
if(m_bRichtung)
m_iRot += 1;
else
m_iRot -= 1;
}
switch(m_iMouseKey)
{
case 1: //Rotation um die x-Achse
m_iRotAchse = ROT_X_ACHSE;
break;
case 2: //Rotation um die z-Achse
m_iRotAchse = ROT_Y_ACHSE;
break;
case 3: //Rotation um die y-Achse
m_iRotAchse = ROT_Z_ACHSE;
break;
default:
break;
}
}
break;
default:
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
bin für jegliche Hilfe dankbar
greetz giniman
Zuletzt bearbeitet: