我对考试作弊有很好的想法.我的学校使用非常旧的IDE(想想Turbo Pascal,Turbo C和其他80年代的IDE),我想做的是: 在后台启动我的程序 拦截按键,而不是直接将它们发送到屏幕,我想从预先配置
>在后台启动我的程序
>拦截按键,而不是直接将它们发送到屏幕,我想从预先配置的文本文件中读取一个字符,然后将其作为按下的键发送.这样,无论你写什么,该文件中的文本都会写在屏幕上.
我找到了Stephen Toub’s篇关于记录密钥的文章,我认为这将是构建这个“工具”的良好开端.拦截系统中按下的所有按键是否有比SetWindowsHookEx更好的替代方法?代码是否会被防病毒程序标记为可疑程序?如果是这样,还有什么我可以用来实现这一点而不被防病毒软件标记?是否需要管理员权限?
我知道你们中的一些人会说,如果我对学习的兴趣与避免学习一样多,我会做得很好,但我想尝试一下.
编辑:我添加了一个赏金,我对捕获击键的一些技术感兴趣(我对低级挂钩或高级东西不感兴趣 – 基本的东西很好),主要是方法名称和一些文档链接.我还想知道它们是否会像防病毒一样出现恶意软件.
神!前几天我刚刚找到了完美的课程..花了一些时间才找到原始来源:http://www.codeproject.com/KB/cs/globalhook.aspx
我单独使用此(和SendKeys)完全满足您的需要,您需要使用Handle = true来阻止原始密钥消息.
SendKeys有点难看……如果您愿意,可以寻找替代品……但SendKeys会为您效劳.
使用SendKeys,它是这样的:
private void HookManager_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.D){ e.Handled = true; SendKeys.Send("F"); } }
我实际上也使用这种方法来确定什么样的prccess’窗口是焦点,所以如果你在另一个应用程序上,应用程序将什么都不做:
/// <summary> /// The GetForegroundWindow function returns a handle to the foreground window. /// </summary> [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); static bool IsProcessFocused(string processname) { if (processname == null || processname.Length == 0) { throw new ArgumentNullException("processname"); } Process[] runninProcesses = Process.GetProcessesByName(processname); IntPtr activeWindowHandle = GetForegroundWindow(); foreach (Process process in runninProcesses) { if (process.MainWindowHandle.Equals(activeWindowHandle)) { return true; } } // Process was not found or didn't had the focus. return false; }