Konsolen messages abfangen...



  • Ich habe ein Programm was von der Konsole aus gestartet wird.
    Dass Programm verschiebt die Konsole sofort in den Tray,
    während dessen (oder eher eine Zeile drüber) wird eine Funktion aufgerufen, die einen Icon im Tray erstellt.

    a: Ich will dass wenn ich auf diesen Icon klicke die Konsole wieder geöffnet wird (Momentan wurde mir geraten ich solle ein Fenster kreiren [um WndProc zu registrieren] und von dort aus alles managen, dass ist aber meiner Meinung nach unnötig resourvenfressend...)

    b: Ich will dass, wenn ich auf Minimieren bei der Konsole klicke, sie sich in den Tray schiebt.

    Dass geht über messages (WM_SIZE und wParam == MINIMIZED) die ich aber Logischerweise von der Konsole abfangen muss...

    Ist dass realisierbar?

    [edit]
    Habe noch geforscht...
    GetMessage scheint ja auch speziell von HWNDs nachrichten erhalten zu können.

    [...]
    
    HWND myConsol;
    
    [...]
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow )
    {
    	myInst = hInstance;
    	myConsol = GetConsoleWindow();
    
    [...]
    
        _beginthread( getConsolMessage, 0, NULL );
    
    [...]
    
    }
    
    [...]
    
    void getConsolMessage( void )
    {
    	MSG consolMessage;
    
    	while( 1 )
    	{
    		while( GetMessage( &consolMessage, NULL, 0, 0 ) )
    		{			
    			Sleep( 1000 );
    
    			TranslateMessage( &consolMessage );
    			DispatchMessage( &consolMessage );
    
    		}
    
    		MessageBox( NULL, "erhielt Message", "Hinweis:", MB_OK );
    
    		if( consolMessage.hwnd == myConsol )
    		{
    			MessageBox( NULL, "Konsole erhielt Message", "Hinweis:", MB_OK );
    			if( SIZE_MINIMIZED == consolMessage.wParam )
    			{
    				MessageBox( NULL, "Konsole wurde Minimiert", "Hinweis:", MB_OK );
    			}
    		}
    	}
    	_endthread();
    }
    

    Hatte auch schon

    while( GetMessage( &consolMessage, myConsol, 0, 0 ) )
    

    aber dass Funktionierte auch nicht.
    Die MessageBox "erhielt Message" wird nie angezeit... Warum?

    [edit2]
    Auch die Umstellung der Analyse der Nachricht in WndProc

    LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
    {
    
    [...]
    
    if( hWnd == myConsol )
    	{
    		MessageBox( NULL, "Konsole erhielt Message", "Hinweis:", MB_OK );
    		if( SIZE_MINIMIZED == wParam )
    		{
    			MessageBox( NULL, "Konsole wurde Minimiert", "Hinweis:", MB_OK );
    		}
    	}
    
    [...]
    
    }
    

    Funktionierte nicht.


  • Mod

    Das kann nicht gehen. Fenster sind thread afin. Dein Comsolefenster liegt in einem anderen Thread. Deine Nachrichtenschleife in dem neuen Thread bekommt keine Nachrichten weil es in diesem Thread keine Fenster gibt.

    Versuche das Handle hiermit zu bekommen:
    http://support.microsoft.com/kb/q124103/

    Dann ordinären Subclass druchführen.



  • Man kann kein Consolen-Fenster subclassen, da dieses in csrss liegt... und mit Vista geht es gleich gar nicht mehr...


  • Mod



  • Also kann ich bei Vista nicht mehr die Konsole bedienen?

    Vista wird mir immer unsympatischer...


  • Mod

    lippoliv schrieb:

    Also kann ich bei Vista nicht mehr die Konsole bedienen?

    Vista wird mir immer unsympatischer...

    Nein, es geht gar nicht! Man kann keine Consolen Fenster subclassen das ist die Aussage.



  • Was willst Du den "Bedienen"?

    Was möchtest Du denn machen? Reicht Dir "ReadConsoleInput" nicht?
    Da hast Du "Focus/Keyboard/Mouse/Menü/Resizing" Events... was willst Du mehr?



  • Ich will lediglich diese Minimize Message abfangen, und dann die Konsole verstecken -was ja geht, da ich es schon mache-...

    Geht dass??



  • Verstecken kannst Du es... GetConsoleWindow... und ShowWindow... Minimize abfangen.... GetConsoleInput mit Resize?



  • GetConsoleInput wurde in diesem Forum erst einmal geschrieben, am 16.01.2008 um 08:36:34...

    Genau dein Post.

    Bei MSDN gibt es auch nichts darüber, es sei denn du hast dich verschrieben...

    Wenn ja, kann ich damit die Messages erhalten?


  • Mod

    lippoliv schrieb:

    GetConsoleInput wurde in diesem Forum erst einmal geschrieben, am 16.01.2008 um 08:36:34...
    Genau dein Post.
    Bei MSDN gibt es auch nichts darüber, es sei denn du hast dich verschrieben...
    Wenn ja, kann ich damit die Messages erhalten?

    Jochen meint vermutlich ReadConsoleInput.
    http://msdn2.microsoft.com/en-us/library/ms684961(VS.85).aspx

    Wenn Du Dir die Consolen Funktionen in der MSDN angesehen hättest wärst Du vermutlich selber darauf gekommen. Viele sind es nicht...
    http://msdn2.microsoft.com/en-us/library/ms682073(VS.85).aspx



  • Ich wusste, etwas ähnliches hatte ich schonmal gelesen.

    Ich dachte mit Input währe was anderes gemeint, kann dir auch nicht sagen was.

    Danke werds mir ansehen.



  • void getConsolMessage( void )
    {
    	HANDLE consol = GetStdHandle( STD_INPUT_HANDLE );
    
    	MSG consolMessage;
    
    	INPUT_RECORD consolRecord[128];
    
    	DWORD numberOfRecords;
    
    	int i = 0;
    
    	while( 1 )
    	{
    		ReadConsoleInput( consol, consolRecord, 128, &numberOfRecords );
    
    		for( i = 0; i < numberOfRecords; i++ )
    		{
    			switch( consolRecord[i].EventType )
    			{
    				case WINDOW_BUFFER_SIZE_EVENT:
    					ResizeEventProc( consolRecord[i].Event.WindowBufferSizeEvent );
    				break;
    			}
    		}
    	}
    	_endthread();
    }
    
    void ResizeEventProc( WINDOW_BUFFER_SIZE_RECORD size )
    {
        MessageBox( NULL, "Text", "Titel", MB_OK );
    }
    

    Ich warte hier sehnlich auf eine MessageBox, aber es kommt keine, auch wenn ich minimieren klicke... 😡
    Es ist echt schrecklich 🙄

    Ist dass überhaupt dass was ihr meint 😕
    Ich bin bestimmt wieder voll dran vorbei ne 😃

    Danke für alle Antworten


  • Mod

    Da Jochen ein Fragezeichen hinter das Resize gesetzt hat vermute ich, dass er es nicht genau weiß ob es geht.

    Ich vermute mal, dass es nicht geht.

    Du könntest aber einfach das Windows Handle Dir besorgen (siehe mein Link, oder GetCOnsoleWindow) und prüfen ob es minimiert ist.

    Ansonsten, wen interessiert ob ein Console Window minimiert wird, vor allem wen mein Prozess von jemandem anderen gestartet wurde? Evtl. gibt es ja gar kein Window?

    Was bezweckst Du damit? Oder bist Du evtl. überhaupt auf dem falschen Weg und müsstest eine GUI Applikation bauen?



  • Hey Martin,
    es geht immer noch um diese NaDiA geschichte.

    Es ist meine Applikation (oder halt die von uns Auszubildenden) die in der cmd.exe gestartet wird, und sofort in den Tray geht.

    Bei einem klick auf den Icon kommt sie wieder hervor.

    Bei einem klick auf Minimieren verschwindet sie in die Task-Bar was unschön ist, da die Application wieder in den Tray gehen soll.

    Dass habe ich über isIconic() und einen 200ms Timer gelöst.

    Ich habe es nicht hinbekommen die gewollte information zu bekommen, obwohl es wohl nach MSDN möglich sein sollte...
    Ich habe aber das printf() nicht bekommen...
    (bei mir währs ne MessageBox gewesen 🤡 )

    (wieso der Link nicht geht, weiss ich nicht)


Anmelden zum Antworten