3

我对考试作弊有个好主意。我的学校使用非常旧的 IDE(想想 Turbo Pascal、Turbo C++ 和其他 80 年代的),我想做的是:

  • 在后台启动我的程序

  • 拦截按键,而不是将它们直接发送到屏幕,我想从预先配置的文本文件中读取一个字符,并将其作为按下的键发送。这样,无论您要写什么,该文件中的文本都会写在屏幕上。

我找到了Stephen Toub 的关于记录密钥的文章,我认为它将作为构建这个“ tool”的良好开端。有没有比拦截系统中按下的所有键更好的替代方法SetWindowsHookEx?该代码是否会被防病毒软件标记为可疑程序?如果是这样,我还有什么可以用来完成此操作而不会被防病毒软件标记的吗?是否需要管理员权限?

我知道你们中的一些人会说,如果我对学习的兴趣和对避免学习的兴趣一样多,我会做得很好,但我想尝试一下。

编辑:我添加了一个赏金,我对一些捕获击键的技术感兴趣(我对低级挂钩或高级东西不感兴趣 - 基本的很好),主要是方法名称和一些文档链接。我还想知道它们是否会在防病毒软件中显示为恶意软件。

4

4 回答 4

2

SetWindowsHookEx 是最好的选择。有人告诉我,一些防病毒程序会标记它,但我使用它创建了一个小应用程序并使用 AVG 扫描它,它没有返回任何病毒警报。

于 2009-10-10T16:00:39.780 回答
2

上帝!前几天我刚刚找到了完美的课程。我花了一段时间才找到原始来源:

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;
    }
于 2009-10-22T23:55:16.397 回答
2

我不是说作弊是好的,但我们理解你的请求。我不认为没有进入 API 挂钩是可能的,因为 .Net 包装了 WIN32 API,我认为他们没有包装你想要的方法。

为了完整起见,让我们添加一些细节:

不幸的是,您必须进入 WIN32 API:http: //msdn.microsoft.com/en-us/library/ms645530 (VS.85).aspx

WM_SYSKEYDOWN通知可用于获取击键,但它需要要监视的窗口句柄,因此它会涉及 *GetWindow** API 来获取要监视的窗口的句柄。

尝试使用SendInputkeybd_event [ http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx]函数来模拟击键。

谷歌“WIN API Viewer”是一个实用程序,可以轻松搜索和查看所述 API,也有一个用于 .Net 代码的版本。

这是需要大量试验和错误的事情之一,我希望我能为您提供更明确的答案。

于 2009-10-22T09:26:31.423 回答
1

据我所知,键盘记录最可靠的方法是设置系统范围的中断(我认为是 INT17h?),但考虑到您的帖子被标记为 C#,这是相当低的级别。去搜索一个相关的工具......你会发现很多......

于 2009-10-10T16:04:19.787 回答