2010-07-09 3 views
9

Quelqu'un peut-il s'il vous plaît me dire comment désactiver les touches de commutation de tâche à l'aide C#Comment Réprimer touches de commutation de tâches (winkey, alt-tab, alt-esc, ctrl-esc) en utilisant le crochet du clavier bas niveau en C#

+1

Pourquoi voudriez-vous faire cela? – Fosco

+4

Tout type d'application de kiosque ... Question valide ne sais pas pourquoi le DV, c'est probablement un doublon si. –

+0

La plupart des jeux sur PC le font. Le plein écran exclusif améliore les performances sur de nombreux systèmes, et qui veut que le chat Skype apparaisse lorsque vous essayez de jouer à votre jeu préféré? – yoyo

Répondre

15

J'ai le code complet pour désactiver Touche Windows, Alt +Tab et ainsi de suite ..

Et maintenant, je suis fournir le code suivant comme référence pour d'autres:

/* Code to Disable WinKey, Alt+Tab, Ctrl+Esc Starts Here */ 

    // Structure contain information about low-level keyboard input event 
    [StructLayout(LayoutKind.Sequential)] 
    private struct KBDLLHOOKSTRUCT 
    { 
     public Keys key; 
     public int scanCode; 
     public int flags; 
     public int time; 
     public IntPtr extra; 
    } 
    //System level functions to be used for hook and unhook keyboard input 
    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hook); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp); 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string name); 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern short GetAsyncKeyState(Keys key); 
    //Declaring Global objects  
    private IntPtr ptrHook; 
    private LowLevelKeyboardProc objKeyboardProcess; 

    private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp) 
    { 
     if (nCode >= 0) 
     { 
      KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT)); 

      // Disabling Windows keys 

      if (objKeyInfo.key == Keys.RWin || objKeyInfo.key == Keys.LWin || objKeyInfo.key == Keys.Tab && HasAltModifier(objKeyInfo.flags) || objKeyInfo.key == Keys.Escape && (ModifierKeys & Keys.Control) == Keys.Control)  
      { 
       return (IntPtr)1; // if 0 is returned then All the above keys will be enabled 
      } 
     } 
     return CallNextHookEx(ptrHook, nCode, wp, lp); 
    } 

    bool HasAltModifier(int flags) 
    { 
     return (flags & 0x20) == 0x20; 
    } 

    /* Code to Disable WinKey, Alt+Tab, Ctrl+Esc Ends Here */ 

Puis à l'intérieur du Form_Load();

private void Form_Load(object sender, EventArgs e) 
    { 
     ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule; 
     objKeyboardProcess = new LowLevelKeyboardProc(captureKey); 
     ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); 
    } 
+0

Je reçois cette erreur Erreur \t 'System.Windows.Input.ModifierKeys 'est un' type 'mais est utilisé comme une' variable' – Omar

+1

J'ai fini par utiliser cette vérification' if (objKeyInfo.key == Keys.RWin || objKeyInfo .key == Keys.Win || objKeyInfo.key == Keys.Tab && HasAltModifier (objKeyInfo.flags) || objKeyInfo.key == Keys.Escape && (Clavier.Modifiers & ModifierKeys.Control)! = 0) ' – Omar

+0

J'utilise ce code, mais j'ai une erreur 'Tenté de lire ou d'écrire de la mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue ' – Niloo

5

Vous pouvez utiliser l'événement OnKeyDown pour capturer les touches enfoncées et supprimer celles que vous ne voulez pas autoriser.

Le BabySmash application de Scott Hanselman désactive la plupart des touches comme alt-tab alt-esc, etc. La plupart des source and development peuvent être trouvées sur son blog. La source est sur GitHub. Dans la source, vous verrez la classe InterceptKeys qui utilise de nombreux appels win32 pour obtenir des crochets de bas niveau sur les touches enfoncées. Il les traite ensuite dans HookCallback dans le fichier App.xaml.cs. J'espère que cela t'aides.

Similar Question

Another Similar

+0

a ajouté une autre question SO similaire. Vous ne pouvez pas attraper ctrl-alt-del, et probablement pas alt-tab, mais la plupart des autres. Devrait être capable de gagner la clé. –

+0

l'exemple babysmash fait ce que vous cherchez –

+2

Alt-Tab est attrapable, mais pas recommandé. Ctrl-Alt-Suppr ne peut pas être intercepté en mode utilisateur. Arrêt complet. – ChrisV

Questions connexes