ctrl-alt-delete、alt-tab、Startおよびその他の組み合わせの無効化

これは、C#を使用したWindowsホットキーのプログラムによる無効化と有効化に関するtamas.ioの記事の無料翻訳です。 最近では、私自身がプログラムでそのような機能を必要としていましたが、RuNetにはこれについて何も記載されておらず、実際にはネットワーク上でそれについてほとんど語られていないことに驚きました。 それで、もしそれが私にとってそうであったように、それが面白いか必要であるならば-ようこそ!



この記事は2007年に執筆しましたが、まだWebを閲覧しており、 StackOverflowDotNetSpiderなどのさまざまな議論で言及されているので、再度公開することにしました。 これはその時点でも関連性があり、その時点では物理的に存在していなかったため、Windows 7ではテストされていません。

読み続ける前に、この記事では悪意のあるアプリケーションを作成することを推奨していないことに注意してください。 以下のコードは、教育目的または娯楽目的で使用できます。



キーとその組み合わせを無効にすることについて少し調査した結果、前述のキーコンボの動作を変更する方法がいくつかあることがわかりました。



心配する必要はありません。ここではそれらを検討しませんが、それらの使用方法を示します。



C#レジストリの編集機能を使用して、CTRL-ALT-DELキーシーケンスのグループポリシーを設定/変更します。 コードを1行も書かずに何ができるかを見てみましょう。 「スタート->実行」を開いて、gpedit.mscと入力します。 CtrlキーとAltキーを押しながらDelキーを押した後、[ユーザーの構成]> [管理用テンプレート]> [システム]>([ユーザーの構成]> [管理用テンプレート]> [システム]> [CTRL + ALT + これは、標準の方法で、このコンボをクリックしてトリガーされるアクションを設定できる場所です。 [タスクマネージャの削除]をダブルクリックします。 このパラメーターを変更すると、Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Systemの値が変更され、DisableTaskMgrの値は1になります。



これでタスクが明確になりました。



重要、この行をスキップしないでください:



using Microsoft.Win32;
      
      







私が書いた方法は次のとおりです。



 public void KillCtrlAltDelete() { RegistryKey regkey; string keyValueInt = "1"; string subKey = @"Software\Microsoft\Windows\CurrentVersion\Policies\System"; try { regkey = Registry.CurrentUser.CreateSubKey(subKey); regkey.SetValue("DisableTaskMgr", keyValueInt); regkey.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
      
      







そのため、CTRL-ALT-DELの組み合わせの値を変更しました。 残りの組み合わせを検討してください。 複雑に思えるかもしれませんが、簡単です。 ALT + F4を無効にする方法は? 5行のコードのみ:



 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; base.OnClosing(e); }
      
      







いいね 私は残りについて多くを読まなければならなかったし、今では私がそれを理解するのに役立つそれらの記事に正確に名前を付けることは難しいだろうが、少なくとも15の有益な情報を含むも​​のがあった。 フックと呼ばれるメソッドを提供します。 コードスニペットはLowLevelKeyboardProcを使用します。



LowLevelKeyboardProcプロシージャは、SetWindowsHookEx関数と共に使用されるソフトウェア定義またはライブラリ固有の関数呼び出しプロシージャです。 キーボード入力イベントが入力ストリームキューに配置される直前に、システムはこの関数を呼び出します。 キーボード入力は、ドライバーまたはkeybdevent呼び出しを介して実行できます。 呼び出しがkeybdevent呼び出しを介して発生した場合、「挿入」されました。 ただし、WHKEYBOARDLLフックは別のプロセスに挿入されません。 代わりに、コンテキストは、フックが設定され、元の形式で呼び出される別のプロセスに切り替わります。 次に、コンテキストはこのイベントの原因となったアプリケーションに戻ります。




また、忘れないでください:



 using System.Runtime.InteropServices; using System.Security.Principal; using System.Diagnostics;
      
      







まだ役に立つかもしれない他のすべてはここにあります:



 [DllImport("user32", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId); [DllImport("user32", EntryPoint = "UnhookWindowsHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int UnhookWindowsHookEx(int hHook); public delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam); [DllImport("user32", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam); public const int WH_KEYBOARD_LL = 13; /*code needed to disable start menu*/ [DllImport("user32.dll")] private static extern int FindWindow(string className, string windowText); [DllImport("user32.dll")] private static extern int ShowWindow(int hwnd, int command); private const int SW_HIDE = 0; private const int SW_SHOW = 1; public struct KBDLLHOOKSTRUCT { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } public static int intLLKey; public int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam) { bool blnEat = false; switch (wParam) { case 256: case 257: case 260: case 261: //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key, blnEat = ((lParam.vkCode == 9) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 0)) | ((lParam.vkCode == 91) && (lParam.flags == 1)) | ((lParam.vkCode == 92) && (lParam.flags == 1)) | ((lParam.vkCode == 73) && (lParam.flags == 0)); break; } if (blnEat == true) { return 1; } else { return CallNextHookEx(0, nCode, wParam, ref lParam); } } public void KillStartMenu() { int hwnd = FindWindow("Shell_TrayWnd", ""); ShowWindow(hwnd, SW_HIDE); } private void Form1_Load(object sender, EventArgs e) { intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0); }
      
      





明らかに、すべての組み合わせを再度有効にすることで、プログラムですべての値を返すことができます。

 public static void ShowStartMenu() { int hwnd = FindWindow("Shell_TrayWnd", ""); ShowWindow(hwnd, SW_SHOW); } public static void EnableCTRLALTDEL() { try { string subKey = @"Software\Microsoft\Windows\CurrentVersion\Policies\System"; RegistryKey rk = Registry.CurrentUser; RegistryKey sk1 = rk.OpenSubKey(subKey); if (sk1 != null) rk.DeleteSubKeyTree(subKey); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { UnhookWindowsHookEx(intLLKey); }
      
      







この記事を楽しんで、その中に何か有用なものを見つけてください。 このトピックで見つけられるすべての情報をここで収集しようとしました。



私からは、次の形式の.NET4コードに追加します。



 intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);
      
      







動作しません。 次のようなものを書く必要があります。



 var inst = LoadLibrary("user32.dll").ToInt32(); intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, inst, 0);
      
      







さて、AddHooks構造コードの冒頭で、とりわけ以下をインポートします。



 LoadLibrary: [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] public static extern IntPtr LoadLibrary(string lpFileName);
      
      







翻訳が完全に悪いものではなく、誰かにとって有用であることが判明することを願っています。

UPD: 完成した作業プログラムへのリンク。



All Articles