2017-02-15 191 views
0

我對我的帖子在這裏有一點困惑。如何獲得關於5-10鍵的組合鍵?我打算用雙引號捕捉「!qaz $ esz」鍵。獲取在WPF窗口中輸入的長組合密鑰(密碼)

我的應用程序是一個全屏應用程序,可以在輸入正確的密鑰以啓用桌面訪問之前阻止訪問桌面。我有殺死的Explorer.exe並禁用任務管理器時,該程序啓動和啓用它回來後組合的密碼是正確的: -

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     /** 
     * 1. KILL EXPLORER 
     * 2. DISABLE KEY TO TERMINATE 
     *  = Alt + F4 
     *  = Win + Tab 
     *  = Win + D 
     *  = etc 
     * 3. ACCEPT SPECIFIC KEY ONLY TO UNLOCK TO MINIMIZE AND SET TOP = FALSE 
     * 
     * 
     * **/ 
     RegistryKey regkey = SetKey(TaskManager.Disabled); 
     regkey.Close(); 
    } 
    public static RegistryKey SetKey(TaskManager command) 
    { 
     RegistryKey mKey; 
     string subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"; 
     mKey = Registry.CurrentUser.CreateSubKey(subKey); 
     switch (command) 
     { 
      case TaskManager.Enabled: 
       mKey.SetValue("DisableTaskMgr", 0); 
       break; 
      case TaskManager.Disabled: 
       mKey.SetValue("DisableTaskMgr", 1); 
       break; 
     } 
     return mKey; 
    } 

但一定有東西缺乏對我的代碼,我無法檢測的組合代碼,更多以密碼。

下面的代碼是我測試以查看我輸入的密鑰是否被捕獲。

public MainWindow() 
    { 
     InitializeComponent(); 
     AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent); 
    } 
    private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)) 
     { 
      MessageBox.Show("CTRL + SHIFT + TAB trapped"); // Working 
     } 

     if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
     { 
      MessageBox.Show("CTRL + TAB trapped"); // Working 
     } 

     if (e.Key == Key.F4 && Keyboard.Modifiers.HasFlag(ModifierKeys.Alt)) 
     { 
      MessageBox.Show("ALT + F4 trapped"); // Not working 
     } 
     if (e.Key == Key.D && Keyboard.Modifiers.HasFlag(ModifierKeys.Windows)) 
     { 
      MessageBox.Show("WIN + D trapped"); // Not working 
     } 
     if ((Keyboard.IsKeyDown(Key.LeftShift) && e.Key == Key.D1) && e.Key ==Key.Q && e.Key == Key.A && e.Key == Key.Z && e.Key == Key.D4 && e.Key == Key.E && e.Key == Key.S && e.Key == Key.Z) 
     { 
      MessageBox.Show("COMBOKEY"); // Not working 
      // RUN EXPLORER 
      // ENABLE TASK MANAGER 
     } 
    } 

什麼是不解決是WINLOGO + dALT + TABALT + F4和LONG複合鍵。

我有嘗試一些代碼從這裏: -

  1. https://stackoverflow.com/a/5750757/3436326
  2. https://stackoverflow.com/a/17088823/3436326

我看到寫LowLevelAPI一些討論/發佈/條。我不熟悉訪問底層API,並將其應用在WPF應用程序: -

  1. http://www.tamas.io/c-disable-ctrl-alt-del-alt-tab-alt-f4-start-menu-and-so-on/
  2. https://www.codeproject.com/articles/14485/low-level-windows-api-hooks-from-c-to-stop-unwante
+1

你的組合鍵不會工作,因爲你只是不能同時按下所有這些鍵。 – BugFinder

回答

1
e.Key == Key.Q && e.Key == Key.A 

如果e.Key等於Key.Q,它不能相等到Key.A在同一時間。這就是爲什麼它不起作用。要檢測什麼是這些鍵的序列,因爲你只有一個按鍵偵聽器,你要自己管理國家的護理:

private int passwordState = 0; 

private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
{ 
    // other checks 

    else if (Keyboard.IsKeyDown(Key.LeftShift) && e.Key == Key.D1) 
     passwordState = 1; // first key of the password 
    else if (passwordState == 1 && e.Key == Key.Q) 
     passwordState = 2; 
    else if (passwordState == 2 && e.Key == Key.A) 
     passwordState = 3; 
    else if (passwordState == 3 && e.Key == Key.Z) 
     passwordState = 4; 
    else if (passwordState == 4 && e.Key == Key.D4) 
     passwordState = 5; 
    else if (passwordState == 5 && e.Key == Key.E) 
     passwordState = 6; 
    else if (passwordState == 6 && e.Key == Key.S) 
     passwordState = 7; 
    else if (passwordState == 7 && e.Key == Key.Z) 
    { 
     passwordState = 0; 

     // correct password 
     MessageBox.Show("COMBOKEY"); 
    } 
    else 
     passwordState = 0; // some other/unexpected key: reset password state 
} 

但是,這實在是煩人維護,所以爲什麼你沒有一個特殊的組合鍵,而只是顯示一個用戶輸入密碼的模式提示?是的,你會向用戶顯示一個明確的密碼提示,然後他們可能意外發現,但是那有什麼問題?

+0

嘿戳,你的建議效果很好。我使用你的代碼並獲得了MessageBox。 留下的東西是禁用/預防/ surpress /暫停任意組合鍵,導致程序終止/最小化/開關.. 我是否需要訪問底層API的呢? – Luiey

+0

我對此不太確定。嘗試將'e.Handled'設置爲'true',這樣事件肯定會停止傳播。除此之外,我認爲你可以通過搜索「kiosk模式」(這基本上是你在這裏實現的)來獲得更多的指示。 – poke