Maus Klicks global verhindern



  • Hallo,

    ich schreibe gerade ein Programm, mit man übers Netzwerk 2 PCs steuern kann.
    Und zwar so, dass man links aus dem MainMonitor die Maus bewegt und dann den 2. PC daneben steuern kann.
    Dazu wird die Maus auf dem MainPC versteckt und übers Netzwerk die Maussignale an den 2. PC geschickt.
    Die Maussignale fange ich mit Hooks ab. Das klappt auch. Nur klappt es nicht es zu verhindern, dass die Maussignale auf dem MainPC die Fenster erreichen.

    Ich hatte gehofft, dass man einfach nicht CallNextHookEx aufrufen kann, wenn man die Messages schlucken möchte, aber das klappt nicht.

    LRESULT CALLBACK MouseProc (int nCode, WPARAM wParam, LPARAM lParam)	{ 
    		if (nCode < 0) 
    			return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
    		bool dontforward = false;
    		if(nCode == HC_ACTION){ 
    			if ( (wParam == WM_MOUSEMOVE || wParam == WM_NCMOUSEMOVE) ) { 
    				//if(killinputevents)
    				//	dontforward = true;
    				MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lParam; 
    				HWND caller = FindWindowA("WindowsForms10.Window.8.app.0.378734a","NetController");
    				if(caller != NULL) 
    					PostMessage(caller, RegisterWindowMessageA("MouseMove"), 0, MAKELPARAM(mhs->pt.x, mhs->pt.y)); 
    				//return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
    			}
    
    			else if ( (wParam == WM_LBUTTONDOWN || wParam == WM_LBUTTONDBLCLK || wParam == WM_NCLBUTTONDOWN) ) { 
    				if(killinputevents){
    					dontforward = true;
    				}
    				MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lParam; 
    
    				HWND caller = FindWindowA("WindowsForms10.Window.8.app.0.378734a","NetController");
    				if(caller != NULL) 
    					PostMessage(caller, RegisterWindowMessageA("LButtonDown"), (killinputevents)?1:0, MAKELPARAM(mhs->pt.x, mhs->pt.y)); 
    			}
    		if(dontforward){
    				HWND caller = FindWindowA("WindowsForms10.Window.8.app.0.378734a","NetController");
    				if(caller != NULL) 
    					PostMessage(caller,  RegisterWindowMessageA("KilledMsg"), 0, 0); 
    
    			return 0;	
    		}
    
    		return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam); 
    	}
    

    Das "killedMsg" kommt auch beim "NetController" Fenster an.

    Wie macht man es richtig?


  • Mod

    Warum so kompliziert? Lege ein durchsichtiges Fenster über alle Anwednungen... Dann brauchst Du nicht einen Hook.



  • Und wenn man eine Fullscreen Anwendung hat? Kann man da ein Fenster drüberlegen, ohne dass sich die Fullscreen Anwenung minimiert?


  • Mod

    veio schrieb:

    Und wenn man eine Fullscreen Anwendung hat? Kann man da ein Fenster drüberlegen, ohne dass sich die Fullscreen Anwenung minimiert?

    Klar geht das. Problematisch ist das nur bei DirectX-Fullscreen Anwendungen.

    Bei Fenstern kann man immer nachträglich die Z-Order manipulieren. Und eine Fullscreen Anwendung ist eben auch nur ein Fenster, das eben den ganzen Bildschirm einimmt.



  • Das mit dem transparenten Fenster klappt schonmal ganz gut. danke.

    Aber nun habe ich das gleiche Problem mit der Tastatur. Ich möchte verhindern, dass Alt+Tab oder die Windowstaste auf dem Main PC ausgelöst wird.
    Kann man das überhaupt mit Hooks verhindern?


  • Mod

    veio schrieb:

    Das mit dem transparenten Fenster klappt schonmal ganz gut. danke.

    Aber nun habe ich das gleiche Problem mit der Tastatur. Ich möchte verhindern, dass Alt+Tab oder die Windowstaste auf dem Main PC ausgelöst wird.
    Kann man das überhaupt mit Hooks verhindern?

    Solange keines der Fenster aktiv wird (den Fokus bekommt) hast Du doch gar kein Problem.
    Verhindere das...

    Ansonsten bekommt die aktuelle Anwendung Alt+TAB als WM_SYSCOMMAND mitgeteilt.


Log in to reply