2012-11-10 6 views
1

je tente de supprimer certains raccourcis clavier de Windows (par exemple ALT + TAB, LWIN/RWIN, ALT + F4) donc mon application peut les manipuler elsehow (simulant des pressions sur une machine externe).supprimer certains raccourcis clavier de Windows

Selon d'autres questions et réponses SO cela est censé fonctionner:

 this.PreviewKeyDown += (s, e) => { 
      if (e.Key == Key.LWin || e.Key == Key.RWin) 
       e.Handled = true; 
     }; 

Le problème est, il ne fonctionne pas. Chaque fois que je tape LWIN/RWIN, le menu Démarrer apparaît toujours que je veux supprimer afin que mon application seule puisse l'utiliser. Dans l'extrait ci-dessus, this fait référence à une fenêtre WPF qui était en cours de mise au point pendant le test. (Il devrait évidemment seulement supprimer l'action une fois que la fenêtre a le focus.)

N'importe quelle façon de réaliser ce que je voudrais accomplir?

Merci,

~ Tgys

Répondre

2

Vous pouvez Crochet tous les clavier et même souris événements pour détecter la source d'entrée. En d'autres termes, si vous utilisez le Global Hook comme mentionné dans le lien ci-dessous, vous pouvez capturer les événements du système et les traiter comme des événements normaux ou les supprimer.

Vous devriez jeter un oeil à cet article CodeProject, Processing Global Mouse and Keyboard Hooks in C#

MSDN Reference:

Un hook global surveille les messages pour tous les threads dans le même bureau que le thread appelant. Un crochet spécifique au thread surveille les messages pour un thread individuel uniquement. Une procédure de connexion globale peut être appelée dans le contexte de n'importe quelle application dans le même bureau que le thread appelant, de sorte que la procédure doit être dans un module DLL distinct. Une procédure de hook spécifique au thread est appelée uniquement dans le contexte du thread associé.

code C#:

using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

public partial class MainWindow : Window 
{ 
    // 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)); 
      if (objKeyInfo.key == Keys.RWin || objKeyInfo.key == Keys.LWin) // Disabling Windows keys 
      { 
       return (IntPtr)1; 
      } 
     } 
     return CallNextHookEx(ptrHook, nCode, wp, lp); 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     //Get Current Module 
     ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule; 
     //Assign callback function each time keyboard process 
     objKeyboardProcess = new LowLevelKeyboardProc(CaptureKey); 
     //Setting Hook of Keyboard Process for current module 
     ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); 
    } 
} 

Autres bonnes références:

  1. Low-level Windows API hooks from C# to stop unwanted keystrokes
  2. Disable Special Keys in Win App C#
+1

Le premier article que vous mentionnez, pas w a un [Site CodePlex] (http://globalmousekeyhook.codeplex.com/) où vous pouvez télécharger la bibliothèque. –

+1

Merci de partager cette information, vraiment utile. –