当前位置 : 主页 > 编程语言 > c语言 >

c# – 如何将一些按键转换为其他按键?

来源:互联网 收集:自由互联 发布时间:2021-06-25
我对考试作弊有很好的想法.我的学校使用非常旧的IDE(想想Turbo Pascal,Turbo C和其他80年代的IDE),我想做的是: 在后台启动我的程序 拦截按键,而不是直接将它们发送到屏幕,我想从预先配置
我对考试作弊有很好的想法.我的学校使用非常旧的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;
    }
网友评论