2017-05-22 24 views
-1

こんにちは、ありがとうございました。私の問題は、私は研究の助けを借りてクラスファイルを作成し、私のウィンドウキーを無効にするコードを発見し、私はこのコードをチェックボックスの値に実装しました。チェックボックスをオンにすると、作成したクラスファイルが実行されますが、このチェックボックスをオフにするとWindowsキーを再度有効にするにはこのコードを無効にする必要があります。私はこのコードが私の頭の上にあることを少し認めます。私はこのコードを何度も繰り返し、構造と動作の仕組みを解明しようとしています。Windowsキーを無効にするWindowsキーを無効にする

class EnableDisableKeys 
{ 
    // 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; 

    public void KeyHook() 
    { 
     ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule; 
     objKeyboardProcess = new LowLevelKeyboardProc(captureKey); 
     ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); 
    } 

    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); 
    } 


} 

私のWinformで。

public partial class ParentalSettingsForm : Form 
{ 
    EnableDisableKeys ed = new EnableDisableKeys(); 
    public ParentalSettingsForm() 
    { 

     InitializeComponent(); 
    } 

    private void ParentalSettingsForm_Load(object sender, EventArgs e) 
    { 

    } 

    private void checkBoxDisableWindowsKey_CheckedChanged(object sender, EventArgs e) 
    { 
     if(checkBoxDisableWindowsKey.Checked == true) 
     { 
      ed.KeyHook(); 
     } 

    } 
} 

は今、私は無効にするにはどこかに変更する必要があるが、それを見つけることができないようにそのおそらくマイナーな設定を知っています。私が答えを得るまで、私はこの解決策に取り組むつもりですが、私が何かを無効にしたり再有効化することに関連して言及したのは完全に新しいものです。ありがとう。

+0

これはおそらくより良い解決策でしょうか? http://stackoverflow.com/questions/32516128/enable-disable-windows-key –

+0

返信ありがとう私はすでにこの解決策を見ているが、それが起こるためにシステムの再起動が必要と私はそれをしたくない。このコード内でWinキーを無効にすることが可能な場合は、再度有効にする必要がありますが、提案に感謝します:) – PaulD1983

答えて

1

クラスにブーリアンフラグを設定して、勝利キーを抑止するかどうかを指定します。 captureKey()メソッドでチェックしてください。 (ないチェックボックスに応答して)フォームのロード時にフォームで

public bool SuppressWinKey = true; 

    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 
      { 
       if (SuppressWinKey) 
       { 
        return (IntPtr)1; 
       } 
      } 
     } 
     return CallNextHookEx(ptrHook, nCode, wp, lp); 
    } 

、セットアップフック:

EnableDisableKeys ed = new EnableDisableKeys(); 

private void ParentalSettingsForm_Load(object sender, EventArgs e) 
{ 
    ed.KeyHook(); 
} 

は今そのフラグを切り替えるここで私は、鍵を抑制するためにデフォルトを設定しましたチェックボックスが変更されたとき:

private void checkBoxDisableWindowsKey_CheckedChanged(object sender, EventArgs e) 
{ 
    ed.SuppressWinKey = checkBoxDisableWindowsKey.Checked; 
} 
関連する問題