Strg+Alt+Del



  • Hallo

    Gibt es eine Möglichkeit zu überprüfen, ob Strg,Alt und Del zusammen gedrück wurden? Also die Tastenkombination, die unter Windows den Taskmanager öffnet.
    Hier (http://www.datasource.de/programmierung/tab01_tastaturcodes.htm) habe ich leider die Tasten die ich brauche nicht gefunden.



  • Nein unter Windows/Win-Konsole geht das nicht. Dein Programm erhält erst gar keine Message, dass STRG-ALT-ENTF gedrückt wurde! Windows fängt das ab und öffnet entweder den Task-Manager oder geht zum Anmeldebildschirm (je nach Einstellung).

    Unter DOS ist es ein bedingungsloser Neustart - also auch dort ist es nicht möglich diese Tastenkombination abzufangen.

    MfG SideWinder



  • Ich lese aber die Tastatureingaben aus - also wie ein Keylogger.
    Und Ctrl hat bei mit den Wert 164, Alt den 18 und Del 46 - glaube ich zumindest.
    Und so kann ich das doch überprüfen. Oder nicht?

    [ Dieser Beitrag wurde am 16.04.2003 um 14:49 Uhr von Trunxx editiert. ]



  • Du bekommst die Tasten einzeln wenn sie gedrückt werden ja - sobald aber Windows eine Kombi dieser 3 Tasten bemerkt, ist schluss mit lustig.

    Windows bekommt die Tasten eben als erster -> dein Programm bekommt sie nur bei Bedarf!

    MfG SideWinder



  • Aha, ok.
    Aber ich könnte es ja so machen, dass wenn Tasten Strg, Alt und Del nacheinander in ca. 2 Sekunden gedrückt werden, mein Programm es einfach als Strg+Alt+Del erkennt und dann dementsprechend reagiert.



  • Du kannst auch zuerst STRG dann ALT und dann ENTF in keinem Abstand drücken lassen - Windows ist es egal ob die 3 hintereinander ankommen - nur gleichzeitig gedrückt dürfen diese Tasten _nie_ sein. Das kannst du auch egal wie _nie_ abrufen ;).

    MfG SideWinder



  • Aber ich könnte das doch so überprüfen:

    wenn
      Strg && Alt && Del ||
      Alt && Strg && Del ||
      Del && Alt && Strg ||
      usw...
    mache
      was weiss ich
    

    Oder würde das zu viel Rechenzeit beanspruchen, da ich das ja bei jeder Tastatureingabe überprüfen muss!?



  • Nö siehs doch ein :p;).

    Die _Kombination_ STRG+ALT+ENTF ist nicht abrufbar! Es sei denn du koppelst etwas Hardwaremäßiges zwischen OS und deinem Tastatur das STRG+ALT+ENTF-Kombis umwandelt.

    Ob die Tasten hintereinander gedrückt worden sind ist Windows egal -> du kannst dann ganz normal abrufen als wären die Tasten POS1 EINFG ENTF hintereinander gedrückt worden.

    Man bemerke die + für eine Kombination, das Hintereinanderschreiben mit Leerzeichen bei hintereinander gedrückten Tasten.

    MfG SideWinder



  • Ja, die Kombination kann ich nicht überprüfen, aber ich kann doch wie in meinem letzten Post geschrieben alle einzeln druchprobieren. Und wenn alle innerhalb von sagen wir mal 2 Sekunden gedrückt worden sind, das als eben diese Windows Kombination erkennen. Ich möchte auch gar nicht den Taskmanager öffnen, sondern nur überprüfen ob diese 3 Tasten innerhalb von 2 Sekunden gedrückt worden sind.

    Ok, Frage: Gibt es für die Tasten Strg, Alt und Del ASCII Codes?

    Wenn ich wieder falsch liege: Ich seh das einfach nicht ein, dass das nicht funktioniert und ich werde einfach probieren 😃
    Falls ich es dann schaffe, werde ich es hier posten 🙂



  • Ja solange du es schaffst alle 3 innerhalb von 2 Sekunden hintereinander zu drücken ist das ohne weiteres möglich.

    ENTF ist leicht zu finden - im von dir genannten Link aus der FAQ.

    Problematischer ist da schon STRG und ALT da es nur Steuertasten sind und bei getch() nie ankommen wenn sie in keiner Kombi gedrückt wurden.

    Aber auch hier hab ich schon mal was gebastelt - bin aber grade auf der HDD meines Bruders und muss auch gleich weg -> also ich schau da morgen für dich :). Eventuell schaffst du es ja auch selber ;).

    MfG SideWinder



  • @Side
    Kannst du mir das von dir mal gebastelte bitte schicken oder hier posten?



  • #include <iostream>
    #include <windows.h>
    
    int main ()
    {
        HANDLE hin = GetStdHandle ( STD_INPUT_HANDLE );
        INPUT_RECORD * pir = new INPUT_RECORD;
    
        while ( true )
        {       
            DWORD control ( 0 );
            DWORD number ( 0 );     
            GetNumberOfConsoleInputEvents( hin , &number );
    
            if ( number )
            {               
                ReadConsoleInput ( hin , pir , 1 , &control );          
    
                if ( pir->EventType == KEY_EVENT )
                {                   
                    if ( pir->Event.KeyEvent.dwControlKeyState == LEFT_CTRL_PRESSED )                                    
                    {
                        std::cout << "LEFT STRG pressed" << std::endl;
                    }               
                }
            }
    
        }
    
        delete pir;
    
        return ( 0 );
    }
    

    Da ich aber einfach auf "== LEFT_CTRL_PRESSED" prüfe, darf dabei keine andere Kontrolltaste wie zB die NumLock-Taste auf "ON" sein. Wenn du das auch haben willst musst du dir eine Maske bauen.

    MfG SideWinder



  • Wen du darauf abzielst, den Taskman zu deaktivieren, dann geht das nur unter Win9x. Da solltest du dir mal SystemParametersInfo() anschauen (mit SPI_SCREENSAVERRUNNING).

    @Side: Ich höre hier gerade mit meinem eigens geschriebenen BabyPlayer das Lied "The Sidewinder sleeps tonight" von REM in ner Loop. 😃 Wollte das nur noch loswerden. 😉



  • Original erstellt von SideWinder:
    **(.....)

    Unter DOS ist es ein bedingungsloser Neustart - also auch dort ist es nicht möglich diese Tastenkombination abzufangen.

    MfG SideWinder**

    das ist leider (oder gottseidank) nicht ganz richtig. Unter DOS kann man die komplette Tastatur beeinflussen. Ich hab das früher bei BASIC Programmen gemacht, um Pause, ctrl-c, string-alt-entf etc. zu unterbinden.
    Geht allerdings nur in asm:

    START:
            push ds,es
    
            cli                             ;Tastenint 9 umbiegen
            xor ax,ax
            mov es,ax
            mov ax,es:[9*4]
            mov w cs:oldint9,ax             ;den alten Vektor merken
            mov ax,es:[9*4+2]
            mov w cs:oldint9[2],ax 
    
            mov ax,offset neueadresse       ;<<<<<<<<<<<<<<<<<
            mov es:[9*4],ax
            mov es:[9*4+2],cs
            sti
    
            pop es,ds
            RETF
            nop
            nop
            nop
            nop
            nop
    ;--------------------------------
    
    ;neuer Timer INT 9: ------------------------------------------
    neueadresse:
            push ax
    
            in al,60
    
            cmp al,0E1              ;PAUSEn Taste 
            jz i2                   ;nichts mehr machen
            cmp al,1d               ;oder Strg Taste
            jz i2                   ;nichts mehr machen
    
            pop ax
            JMP far CS:[oldint9]   ;die Originalroutine durchlaufen
            ;------------------------
    
       i2:  
                mov al,20
                out 20,al           
    
            pop ax
            IRET
    ;-----------------------------------------------------------------
    


  • Okay, okay aber unter Windows lassen sich keine Interrupts mehr umbiegen :p

    MfG SideWinder



  • Wen du darauf abzielst, den Taskman zu deaktivieren, dann geht das nur unter Win9x. Da solltest du dir mal SystemParametersInfo() anschauen (mit SPI_SCREENSAVERRUNNING).

    Taugt aber nix 🙄 !
    Wenn dann Alt-Tab gedrückt wird reagiert das Programm auch nicht mehr auf Tastatureingaben.Wer weiss was es noch alles für "Nebeneffekte" gibt 😉


Anmelden zum Antworten