【发布时间】:2014-09-10 04:30:38
【问题描述】:
我有一个 C# 控制台应用程序,该应用程序旨在在后台运行并捕获按键事件,如果它与我的热键匹配,我想做一些操作,而不是将该键传递给活动的应用程序。
在我的开发机器上,我可以在没有 Visual Studio 的情况下运行构建 exe 文件,并且我的程序按预期工作。当我在任何应用程序中的任何位置键入热键(f11 或 f12)时,该键事件被捕获并且不会传递到活动应用程序。当我将 exe 部署到另一台机器、相同的操作系统(Windows 8.1 Pro)时,检测到按键并且我可以“做某事”(参见代码),但随后它被传递到活动应用程序。这不是我想要的操作,也不是我在我的开发机器上遇到的。我的具体问题是,为了将这个应用程序部署到其他机器上,我还需要做些什么,以便它们不仅捕获按键事件,而且还不会传递给活动的应用程序?
public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
public static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
Keys pressedKey = (Keys)Marshal.ReadInt32(lParam);
if (pressedKey == Keys.F11 || pressedKey == Keys.F12)
{
// Do something...
// Don't pass the key press on to the system
return (System.IntPtr)1;
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
【问题讨论】:
-
不要让人们点击你的代码链接,也不要在问题中发布太多代码。请尝试创建一个MCVE 并将其发布在您的问题中。
-
我已根据您的有用输入更新了我的问题。谢谢你的解释。
-
这是一个更好的问题,它可能会被重新打开。
标签: c# console listener keypress