Nachrichten in Thread abfangen



  • Ich würde die Nachrichten gerne mit Hilfe eines Threads abfangen. Ich habe das auch einmal ausprobiert, doch es stockt.

    Wieso funktioniert das mit dem Thread nicht?

    #include <windows.h>
    #include <stdio.h>
    
    DWORD WINAPI MessageThread(LPVOID);
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    
    MSG mMsg;
    HWND hHandle;
    WNDCLASS wWndclass;
    
    void main(void)
    {
    	wWndclass.style         = CS_HREDRAW|CS_VREDRAW;
    	wWndclass.lpfnWndPro    = WndProc;
    	wWndclass.cbClsExtra    = 0;
    	wWndclass.cbWndExtra    = 0;
    	wWndclass.hInstance     = 0;
    	wWndclass.hCursor       = LoadCursor(NULL,IDC_ARROW);
    	wWndclass.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
    	wWndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wWndclass.lpszClassName = TEXT("Fensterklasse");
    	wWndclass.lpszMenuName  = NULL;
    	RegisterClass(&wWndclass);
    
    	hHandle=CreateWindow(TEXT("Fensterklasse"),
    				         TEXT("Fenstertitel"),
    				         WS_OVERLAPPEDWINDOW,
    				         0,
    				         0,
    				         200,
    				         200,
    				         NULL,
    				         NULL,
    				         0,
    				         0
                             );
    
    	ShowWindow(hHandle,SW_SHOW);
    	UpdateWindow(hHandle);
    
    	CreateThread(NULL,0,MessageThread,(LPVOID)0,0,NULL);
    
    	printf("Druecken Sie die Enter-Taste um das Programm zu beenden!");
    	getchar();
    }
    
    DWORD WINAPI MessageThread(LPVOID data)
    {
    	while(GetMessage(&mMsg,NULL,0,0))
    	{
    		Sleep(25);
    		TranslateMessage(&mMsg);
    		DispatchMessage(&mMsg);
    	}
    
    	return (0);
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    	switch(message)
    	{
    		case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return 0;
    		}
    	}
    
    	return DefWindowProc(hWnd,message,wParam,lParam);
    }
    


  • In der Zeile muss natürlich noch ein 'c' hin, das ist aber nicht das Problem, leider.

    wWndclass.lpfnWndProc = WndProc;



  • CreateThread(NULL,0,MessageThread,(LPVOID)0,0,NULL);
    

    Startet den Thread ohne Parameter....

    DWORD WINAPI MessageThread(LPVOID data)
    

    Erwartet ein Parameter

    C++ sollte man können wenn man es verwendet -.-



  • Ich arbeite im Thread aber auch nicht mit diesem Parameter, also ist es doch gleichgültig wenn er irgend einen Wert hat.



  • Der Thread ansich funktioniert ja auch.

    Das Problem ist das diese Schlaufe in dem Thread irgendwie nicht funktioniert:

    while(GetMessage(&mMsg,NULL,0,0))
    {
         Sleep(25);
         TranslateMessage(&mMsg);
         DispatchMessage(&mMsg);
    }
    


  • Mit Parameter funktioniert's genauso wenig:

    #include <windows.h> 
    #include <stdio.h> 
    
    DWORD WINAPI MessageThread(LPVOID); 
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    
    MSG mMsg;
    HWND hHandle; 
    WNDCLASS wWndclass;
    
    void main(void) 
    { 
        wWndclass.style         = CS_HREDRAW|CS_VREDRAW; 
        wWndclass.lpfnWndProc   = WndProc; 
        wWndclass.cbClsExtra    = 0; 
        wWndclass.cbWndExtra    = 0; 
        wWndclass.hInstance     = 0; 
        wWndclass.hCursor       = LoadCursor(NULL,IDC_ARROW); 
        wWndclass.hIcon         = LoadIcon(NULL,IDI_APPLICATION); 
        wWndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
        wWndclass.lpszClassName = TEXT("Fensterklasse"); 
        wWndclass.lpszMenuName  = NULL; 
        RegisterClass(&wWndclass); 
    
        hHandle=CreateWindow(TEXT("Fensterklasse"), 
                             TEXT("Fenstertitel"), 
                             WS_OVERLAPPEDWINDOW, 
                             0, 
                             0, 
                             200, 
                             200, 
                             NULL, 
                             NULL, 
                             0, 
                             0 
                             ); 
    
        ShowWindow(hHandle,SW_SHOW); 
        UpdateWindow(hHandle);
    
        CreateThread(NULL,0,MessageThread,(LPVOID)&mMsg,0,NULL); 
    
        printf("Druecken Sie die Enter-Taste um das Programm zu beenden!"); 
        getchar(); 
    }
    
    DWORD WINAPI MessageThread(LPVOID data) 
    {
    	while(!GetMessage(((MSG *)data),NULL,0,0))
    	{
    		Sleep(25);
    		TranslateMessage(((MSG *)data));
    		DispatchMessage(((MSG *)data));
    	}
    	return (0);
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 
    { 
        switch(message) 
        { 
            case WM_DESTROY: 
            { 
                PostQuitMessage(0); 
                return 0; 
            } 
        } 
    
        return DefWindowProc(hWnd,message,wParam,lParam); 
    }
    

  • Mod

    BTW: Was soll bitte der Sleep in der Message Loop?
    Wenn eine Nachricht anliegt, dann ist es doch in Denem ureigenem Interesse, dass diese sofort ohne Verzögerung abgearbeitet wird... oder?
    Diese Verzögerung bringt nichts! GetMessage führt selbst einen "Sleep" aus, wen keine Nachrichten da sind.


Anmelden zum Antworten