在没有它们的笔记本电脑上创建Alt代码

时间:2012-01-13 03:00:12

标签: c++ winapi hook

我的笔记本电脑有一个数字键盘,但它没有NumLock键,而小键盘实际上只是字母上方数字行的副本。这可以通过按下这些键时发送的虚拟键码来确认。

当我按下alt键和常规数字时,我正在尝试开发一个模拟alt代码的小程序。我使用一个低级键盘钩子(我有一个类似的格式在另一个程序中工作),并首先检查是否有一个alt键关闭。如果是,我循环通过VK代码0x30-0x39(0-9键)。如果在那一刻按下其中一个,我会通过返回值1丢弃实际的击键,而是发送该键的小键盘版本(此时alt仍然按下)。

我可以确认是否已到达挂钩,并且正在成功识别正在关闭的alt键。但是,当我在0-9上检查比赛时,在此之后没有任何匹配之前只打印一对,或者每次按下一个数字时我必须抬起并按下alt键。此外,在释放alt后按下一个数字,然后按住alt并按下另一个(这个是16x),可以打印一个数字16次。

另外,我可以确认SendInput序列是通过从钩子复制零件,将其放入main函数并用0x30替换i来确认的。运行时,将在文本文档中键入0。

在文本文档中按住ALT(向下)+ 6 + 5 + ALT(向上)时,显示“65”。如果我添加另一个ALT(向下)+6,则会出现16个六。

钩子程序:

LRESULT CALLBACK proc (int code, WPARAM wParam, LPARAM event) //hook proc
{
    if (code < HC_ACTION) //don't process if not meant to
        return CallNextHookEx (0, code, wParam, event); 

    if (GetAsyncKeyState (VK_MENU) & 0x8000) //if either alt is down
    {
        for (int i = 0x30; i <= 0x39; ++i) //loop 0-9
        {
            if (GetAsyncKeyState (i) & 0x8000) //if index is down
            {
                cout << "MATCH\n"; //debug

                input.ki.wVk = i + 0x30; //set VK code to numpad version of index
                input.ki.dwFlags = 0; //key is being pressed
                SendInput (1, &input, sizeof (INPUT)); //send keystroke down

                input.ki.dwFlags = KEYEVENTF_KEYUP; //key is being released
                SendInput (1, &input, sizeof (INPUT)); //send keystroke up

                while (GetAsyncKeyState (i) & 0x8000) //wait for normal key to be released
                    Sleep (10); //don't hog CPU

                return 1; //discard normal key
            } //end if match
        } //end for
    } //end if alt

    return CallNextHookEx (0, code, wParam, event); //if any key not handled, pass on
} //end function

1 个答案:

答案 0 :(得分:0)

好吧,我终于回到了这里,经过一些测试,我发现以编程方式发送[ALT] [num6] [num5] [ALT]什么都不做。我发现这很奇怪,因为我能够模拟Mac键盘上的音量控制键,尽管没有这些键。

由于计算机根本无法发送alt代码,因此我声明这个有用的工具可以使用,除非我映射了数千个字符。

编辑:

您需要做的就是让数字键盘在G74SX-XA1上工作:

  1. 下载BIOS 203(我不知道202是否有效,我从201到203)。
  2. 将文件放在FAT32格式的闪存驱动器上。
  3. 重新启动计算机,然后按F4直接进入EasyFlash,或通过BIOS导航到它。它附带的Winflash程序不起作用。
  4. 选择闪存驱动器上更新的BIOS文件。
  5. 现在,numlock指示灯将一直打开,数字键盘将具有数字键盘的虚拟键代码,而不是字母上方的数字。这自然包括ALT代码工作。