WM_DRAWCLIPBOARD abfangen



  • Hi

    Ich möchte gerne mit der Console diese WM_DRAWCLIPBOARD abfangen:

    #include <windows.h>
    #include <stdio.h>
    
    WNDPROC lpWndProcOld;
    
    HWND NextCBWnd;
    
    HWND SubHwnd;
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    	if ( message == WM_DRAWCLIPBOARD) {
    		printf("trigger");
    	}
    	return CallWindowProc(lpWndProcOld, hWnd, message, wParam, lParam);
    }
    
    void subclass(void)
    {
    
    	LPSTR ConsoleTitle = new char[256];
    
    	GetConsoleTitle(ConsoleTitle,256);
    
    	SubHwnd = FindWindow(NULL,ConsoleTitle);
    
    	printf("Hwnd: %i \n",FindWindow(NULL,ConsoleTitle));
    
    	lpWndProcOld = (WNDPROC)SetWindowLong(SubHwnd, GWL_WNDPROC, (LONG)WndProc);
    
    	printf("Function %i \n",lpWndProcOld);
    
    	NextCBWnd = SetClipboardViewer(SubHwnd);
    
    }
    
    void endsubclass(void)
    {	
    	SetWindowLong(NULL,GWL_WNDPROC,(LONG)lpWndProcOld);
    
    	ChangeClipboardChain(SubHwnd,NextCBWnd);
    }
    

    Leider gibt die SetWindowLong-Funktion immer 0 zurück-

    MfG Joe



  • [JoE] schrieb:

    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    
    //...
    void subclass( )
    {
        /*
        LPSTR ConsoleTitle = new char[ 256 ];
        GetConsoleTitle( ConsoleTitle, 256 );
        SubHwnd = FindWindow( NULL, ConsoleTitle );
        printf("Hwnd: %i \n", FindWindow( NULL, ConsoleTitle) );
        */
    
        // -->
    
        SubHwnd = GetConsoleWindow( );
    
       // ...
    }
    
    // ...
    
    void endsubclass( )
    {	
    	SetWindowLong( NULL, GWL_WNDPROC, (LONG)lpWndProcOld );
            //             ^ !?
    
            // ...
    }
    

    Greetz, Swordfish



  • Hi

    Danke für deine Antwort. Leider erhalte ich immer noch mit GetConsoleWindow den Error Code 1413:

    #define _WIN32_WINNT (0x0500)
    
    #include <windows.h>
    #include <stdio.h>
    #include <iostream.h>
    
    WNDPROC lpWndProcOld;
    HWND NextCBWnd;
    HWND SubHwnd;
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    
    	printf("trigger");
    	return CallWindowProc(lpWndProcOld, hWnd, message, wParam, lParam);
    }
    
    void subclass(void)
    {
    
    	SubHwnd = GetConsoleWindow();
    
    	printf("Hwnd: %i \n",SubHwnd);
    
    	lpWndProcOld = (WNDPROC)SetWindowLong(SubHwnd, GWL_WNDPROC, (LONG)WndProc);
    
    	printf("Function %i \n",lpWndProcOld);
    
    	printf("%i",GetLastError());
    
    	//1413
    
    	NextCBWnd = SetClipboardViewer(SubHwnd);
    
    }
    
    void endsubclass(void)
    {	
    	SetWindowLong(SubHwnd,GWL_WNDPROC,(LONG)lpWndProcOld);
    
    	ChangeClipboardChain(SubHwnd,NextCBWnd);
    }
    


  • It is not possible to subclass console windows, sorry - they are a special "protected" window class and are quite different from standard GUI window because the console WndProc is implemented inside CSRSS.EXE, even though console windows are owned by the client process (e.g. CMD.EXE)

    MfG Joe



  • GetConsoleWindow( ) war nur als Verbesserungsvorschlag gemeint. Vielleicht erlaubt Microsoft nicht, ein Konsolenfenster auf diese Art zu manipulieren?

    Greetz, Swordfish



  • Swordfish: kannst du kein Englisch?



  • @(D)evil: Witzkeks. Inzwischen sollte eigentlich schon bekannt sein, dass ich vor dem absenden meiner Posts in der Regel 2 bis 5 Minuten in die Luft schaue... 😉

    Greetz, Swordfish


Log in to reply