我对考试作弊有很好的想法。我的学校使用非常旧的IDE(想想Turbo Pascal,Turbo C ++和其他80年代的IDE),我想做的就是:
在后台启动我的程序
拦截按键,而不是直接将它们发送到屏幕上,我想从预先配置的文本文件中读取一个字符,然后将其作为按下的键发送。这样,无论你写什么,该文件中的文本都会写在屏幕上。
我找到了关于记录密钥的Stephen Toub's文章,我认为这将成为构建此“tool
”的良好开端。是否有更好的替代方法来拦截系统中按下的所有键而不是SetWindowsHookEx
?代码是否会被防病毒程序标记为可疑程序?如果是这样,还有什么我可以用来实现这一点而不被防病毒软件标记?是否需要管理员权限?
我知道你们中的一些人会说如果我对学习的兴趣与避免学习一样多,我会做得很好,但我想尝试一下。
编辑:我添加了赏金,我对捕获键击的一些技术很感兴趣(我对低级挂钩或高级东西不感兴趣 - 基本的东西很好),主要是方法名称和一些链接到文档。我还想知道它们是否会像防病毒一样出现恶意软件。答案 0 :(得分:2)
SetWindowsHookEx是最佳选择。我被告知有些防病毒程序会标记它,但是我使用它创建了一个小应用程序并用AVG扫描它,没有返回任何病毒警报。
答案 1 :(得分:2)
并不是说我的作弊很好,但我们理解你的请求。我不认为没有进入API钩子是可能的,因为.Net包装WIN32 API我不认为他们已经包装了你想要的方法。
为了完整起见,我们只是添加一些细节:
不幸的是,您必须进入WIN32 API:http://msdn.microsoft.com/en-us/library/ms645530(VS.85).aspx
WM_SYSKEYDOWN 通知可用于获取击键,但它需要观察窗口的句柄,因此它将涉及* GetWindow ** API来获取窗口的句柄你想要监控。
尝试使用 SendInput 或 keybd_event [http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx]函数来模拟击键。
谷歌“WIN API查看器”,用于轻松搜索和查看所述API的实用程序,还有.Net代码的版本。
这是需要大量试验和错误的事情之一,我希望我能为您提供更明确的答案。
答案 2 :(得分:2)
GOD!前几天我刚刚找到了完美的课程..花了一些时间才找到原始资料来源:
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;
}
答案 3 :(得分:1)
据我所知,keylog最可靠的方法是建立系统范围的中断(我认为INT17h?),但考虑到你的帖子被标记为C#,这个级别相当低。去搜索相关工具......你会找到很多......