Hooks



  • @Ernsti
    Wow, wirklich ein Klasse beitrag. Die sachen standen auch so ziemlich alle im Buch. Hab nur noch was gesucht das tiefer in das Thema geht.
    Bin auch dafür das dies hier in die FAQ sollte...
    Werd mir aber deine spitzen zusammenfassung mal genauer anschauen...
    Thanx



  • Is noch nicht ganz komplett, wie ihr seht fehlen noch einige beschreibungen, bin aber aus zeitgründen noch nicht dazu gekommen. !



  • so, das ist erstmal ferddig - wenn ihr wollt, könnt ihr das in die FAQ klatschen 🤡



  • Wäre klasse wenn man dies hier in die FAQ verschiebene könnte, da sich Ernsti so viel mühe gegeben hat und alles so super erklärt...



  • So, nun ein kleines Beispiel für unser "Hook"-rigen Freunde ! 🤡

    Also, es ist ein einfaches Beispiel, welches die Mauskoordinaten in der X und Y Position mal zwei rechnet, und die umgewandelteten Korrdianten im Tracefenster ausgibt.

    Das ganze ist eine einfache Dialoganwendung.

    //*****************************************************************************
    // HookDlg.h
    //*****************************************************************************
    #pragma once
    
    class CHookDlg : public CDialog
    {
    public:
    	CHookDlg(CWnd* pParent = NULL);	
    	enum { IDD = IDD_HOOK_DIALOG };
    	static HHOOK   hMouseHook;
    protected:
    	virtual BOOL OnInitDialog();
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnDestroy();
    };
    
    //*****************************************************************************
    //*****************************************************************************
    //*****************************************************************************
    
    //*****************************************************************************
    // hookdlg.cpp installiert einen maushook, der die koordinaten ändert.
    // die geänderten koordinaten werden rausgetraced.
    //*****************************************************************************
    
    #include "stdafx.h"
    #include "Hook.h"
    #include "HookDlg.h"
    
    //*****************************************************************************
    // static member
    HHOOK CHookDlg::hMouseHook=NULL;
    
    //*****************************************************************************
    // hookprozedur
    //*****************************************************************************
    LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) 
    { 
    	if(nCode >= 0 && nCode == HC_ACTION) 
    	{ 
    		MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*) lParam; 
    		long nTempX = mhs->pt.x*2; 
    		long nTempY = mhs->pt.x*2; 
    
    		HWND hwnd=FindWindow(NULL,"Hook");  // Hook ist der Titel unseres Dialogs !!!!
    
    		if(!hwnd) 
    			TRACE("Fenster nicht gefunden !"); 
    
    		PostMessage(hwnd, nCode, wParam, MAKELPARAM(nTempX, nTempY)); 
    
    		CString str; 
    		str.Format("X:%d (%d) ,Y:%d (%d)\n",nTempX,mhs->pt.x,nTempY,mhs->pt.y); 
    		TRACE(str); 
    	} 
    	return CallNextHookEx(CHookDlg::hMouseHook, nCode, wParam, lParam); 
    } 
    
    //*****************************************************************************
    // konstruktor
    //*****************************************************************************
    CHookDlg::CHookDlg(CWnd* pParent ) : CDialog(CHookDlg::IDD, pParent)
    {
    
    }
    
    //*****************************************************************************
    // messagemap
    //*****************************************************************************
    BEGIN_MESSAGE_MAP(CHookDlg, CDialog)
    	ON_WM_DESTROY()
    END_MESSAGE_MAP()
    
    //*****************************************************************************
    // hook anlegen
    //*****************************************************************************
    BOOL CHookDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	hMouseHook = SetWindowsHookEx(WH_MOUSE,   (HOOKPROC) MouseHookProc, AfxGetInstanceHandle(),AfxGetThread()->m_nThreadID);
    	return TRUE; 
    }
    
    //*****************************************************************************
    // hier hook wieder entfernen !
    //*****************************************************************************
    void CHookDlg::OnDestroy()
    {
    	if(hMouseHook)
    	{
    		UnhookWindowsHookEx(hMouseHook);
    		hMouseHook=NULL;
    	}
    }
    
    //*****************************************************************************
    //*****************************************************************************
    //*****************************************************************************
    
    [cpp]
    


  • Was soll ein nicht-globaler Hook bringen? In meinem eigenen Programm komm ich doch eh an alle Messages.



  • Du kannst die Nachrichten "manipulieren" - ändern - oder sonstwas.
    Du kannst Nachrichten rausfiltern, aus Mausmessages Tastaturmessages machen....

    Ich musste mal für eine Anwendung die Mauskoordinaten um 90 Grad drehen (ich glaube da müssten noch reste im forum stehen...), da nahm ich eben diesen Maushook.
    Und ausserdem stellt es nur ein grundlegendes Beispiel über einen Hook dar.
    Ich wollte hier nicht die volle Megaanwendung coden, die keiner mehr lesen kann.
    Aber falls noch irgendwelche Fragen im Raum sehen, werde ich natürlich versuchen, sie so gut als möglich zu beantworten. 😉



  • Dann kann man das doch einfach in der Nachrichtenschleife ändern und filtern??



  • So, ich hatte eine ANwendung, in der ich einen (GDI) Dialog über DirectX (damals 7.0) um 90 Grad gedreht als DirectX Surface auf den Schirm geblittet habe.
    Nun befanden sich auf diesem Dialog normale Windows Steuerelemente.
    Um mit diesen korrekt zu arbeiten musste ich die mauskoordinaten um 90 grad drehen......

    So, zeig mir mal, wie du eine Nachricht zb. ON_BNCLICKED, ON_COMMAND, ON_WM_LBUTTONDOWN, usw..... von irgendwelchen Steuerelementen änderst, so das das Steuerelement reagiert, als wäre der Dialog nicht gedreht gezeichnet ?????

    ... viel spass ...



  • Also Maus und Tastaturnachrichten (bzw. alle Nachrichten die gepostet werden) kann ich in PreTranslateMessage ändern.


Anmelden zum Antworten