【发布时间】:2014-03-14 10:40:10
【问题描述】:
我使用的是 Windows 8。我尝试使用 c# 禁用 Windows 键,例如 http://tamas.io/c-disable-ctrl-alt-del-alt-tab-alt-f4-start-menu-and-so-on/ 。它没有错误,但没有禁用 Windows 键。如何使用 C# 禁用 Windows 键?
这是我的代码。
namespace TestDisable
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[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;
try
{
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)) // alt+tab
| ((lParam.vkCode == 27) && (lParam.flags == 32)) // alt+esc
| ((lParam.vkCode == 27) && (lParam.flags == 0)) // ctrl+esc
| ((lParam.vkCode == 91) && (lParam.flags == 1)) // left winkey
| ((lParam.vkCode == 92) && (lParam.flags == 1))
| ((lParam.vkCode == 73) && (lParam.flags == 0));
break;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if (blnEat == true)
{
return 1;
}
else
{
return CallNextHookEx(0, nCode, wParam, ref lParam);
}
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
【问题讨论】:
-
“没有错误”。你怎么知道的?您没有检查错误。
-
现在我将 try catch 放入 LowLevelKeyboardProc()、Form1_Load() 和 button1_Click() 中。它不显示错误。在 VC# 输出中也没有错误。但是当我按下 Winsdows 键时它仍然显示开始。
-
您没有检查错误。 Windows API 函数不会引发异常。您是否阅读过您调用的函数的文档?专注于返回值部分。
标签: c# winapi pinvoke keyboard-hook