hook setzen
-
Hallo,
ich bekomme das einfach nicht hin in c++. Unter VB läufts einwandfrei!
Kann mir jemmand sagen wie ich das in c++ hinbekomme ?Option Explicit Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" (ByVal hWnd As Long, _ ByVal nIndex As Long, ByVal dwNewLong As Long) _ As Long Private Declare Function CallWindowProc Lib "user32" _ Alias "CallWindowProcA" (ByVal lpPrevWndFunc _ As Long, ByVal hWnd As Long, ByVal Msg As _ Long, ByVal wParam As Long, ByVal lParam As _ Long) As Long Private Const GWL_WNDPROC = (-4&) Private Const WM_LBUTTONDOWN As Long = &H201 Dim PrevWndProc& Public Sub Init(hWnd As Long) PrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, _ AddressOf SubWndProc) End Sub Public Sub Terminate(hWnd As Long) Call SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc) End Sub Private Function SubWndProc(ByVal hWnd As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long if Msg = WM_LBUTTONDOWN then call MsgBox("MouseDown") End if SubWndProc = CallWindowProc(PrevWndProc, hWnd, Msg, _ wParam, lParam) End Function
Ganz klar was das hier bedeutet, mit Init initialisiere ich das hook, mit Terminate aktiviere ich wieder das alte und mit SubWndProc prüfe ich die Nachrichten. In diesem Falle wir bei einem Mousedown auf das Fenster eine Meldung ausgegeben.
Wie kann ich den dies mit c++ programmieren! Habe schon probiert es genauso nachzubauen. Aber das funktioniert nicht!
Gruß Ronny
-
Ein Hook ist was anderes. Das was du willst ist unter Subclassing bekannt.
Infos findest du hier: http://www.winapi.net/index.php?inhalt=s27
-
Dank! Aber was ist dann ein Hook ?
-
-
-
long PrevWndProc; void CSubClassDlg::Init(HWND hWnd) { PrevWndProc = SetWindowLong(m_hWnd, GWL_WNDPROC, (long) SubWndProc); } void CSubClassDlg::UnHook(HWND hWnd) { SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc); } LRESULT CALLBACK CSubClassDlg::SubWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { return CallWindowProc((WNDPROC) PrevWndProc, hWnd, nMsg, wParam, lParam); }
Habe es gemacht wie auf http://www.winapi.net/index.php?inhalt=s27 aber es functioniert nicht! Er bringt mir immer einen Compilerfehler! error C2440: 'type cast' : 'long (__stdcall CSubClassDlg::*)(struct HWND__ *,unsigned int,unsigned int,long)' kann nicht in 'long' konvertiert werden
kann mir bitte jemmand weiterhelfen ?
-
Casten:
PrevWndProc = (WNDPROC) SetWindowLong(...
Achso und SubWndProc muss static sein, wenn du es in einer Klasse packst.
-
Achso, das mit dem Casten war falsch. Du hast PrevWndProc ja als long deklariert.
Dann liegt es wahrscheinlich am fehlenden static.
-
static long PrevWndProc;
void CSubClassDlg::Init(HWND hWnd) { PrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, (long) SubWndProc); } void CSubClassDlg::UnHook(HWND hWnd) { SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc); } LRESULT CALLBACK CSubClassDlg::SubWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { return CallWindowProc((WNDPROC) PrevWndProc, hWnd, nMsg, wParam, lParam); }
Fehler bleibt leider trotzdem!
-
Lies meinen Beitrag nochmal.
Die Methode SubWndProc sollte static sein
-
long PrevWndProc; void CSubClassDlg::Init(HWND hWnd) { PrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, (long) SubWndProc); } void CSubClassDlg::UnHook(HWND hWnd) { SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc); } static LRESULT CALLBACK CSubClassDlg::SubWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { return CallWindowProc((WNDPROC) PrevWndProc, hWnd, nMsg, wParam, lParam); }
Meinst du so ?
Geht leider auch nicht!error C2724: 'SubWndProc' : 'static' sollte nicht fuer Member-Funktionen verwendet werden, die ausserhalb der Klasse definiert werden
error C2440: 'type cast' : '' kann nicht in 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' konvertiert werden
Gruß Ronny
-
mach das nur in den Header.
-
error C2440: 'type cast' : '' kann nicht in 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' konvertiert werden
jetzt ist es nur noch einer!
Gruß Ronny
-
der ist in der SubWndProc beim aufruf von CallWindowProc...
-
Helft mir doch bitte!
Vielen Dank!
Gruß Captain Hook
-
Kannst du das Ding irgendwo hochladen?
-
-
thx
aber die adresse funktioniert nicht.
-
-
ah, jetzt weiß ich woran es liegt. du kannst in einer statischen Methode nicht auf die Membervariablen zugreifen. Mach PrevWndProc global bzw. static.