创建一个简单的内存驻留程序

Create a simple memory resident program

我一直对如何 TSR programs worked 很感兴趣,所以我决定开始创建一个非常原始的。

这个 C 程序读取键盘击键并在控制台屏幕上打印它们,除非你输入 a 然后 b 然后 c 然后一个消息框会告诉你你输入 abc 并且退出也 q 将导致程序退出。

请注意,该程序在任务管理器中至少占用了我 CPU 的 15%,为什么? 我尝试将击键与 ESC 中的 27 进行比较,但它没有用。

#include <stdio.h>
#include <conio.h>
#include <Windows.h>

int main() {
  char i;

  while (1) {
    if (kbhit()) {
      i = getch();
      if (i == 'q')
        return 0;
      if (i == 'a') {
        i = getch();
        if (i == 'b') {
          i = getch();
          if (i == 'c') {
            int ans = MessageBox(NULL, "You typed abc\nPress OK to exit", "TSR confirmation", MB_ICONINFORMATION | MB_OK);
            if (ans == 1)
              return 0;
          }
        }
      }
      printf("You pressed %c\n", i);
    }
  }
  return 0;
}

我的问题: 控制台仍然显示,我试图将它编译为 Windows 程序,它自己加载到内存中,我在没有控制台的情况下丢失了它,不得不使用任务管理器来杀死它,有没有办法让它常驻内存并始终在没有控制台的情况下监视我的击键序列。

有没有更好的方法来收听没有嵌套 ifs 的较长字符序列,较长的序列变得很难看。

Why is the program taking a least 15% of my CPU in task manager?

因为你的程序不停地执行循环。而且您似乎有一个带有 6 或 8 个(虚拟)内核的 CPU。实际上你的程序占用了一个核心的100%。

您可以通过在循环中插入 Sleep(1) 来大大减少这种“负载”。这会插入一个“休眠”阶段,它比单圈循环的运行时间长得多,负载将下降到接近 0%。

Is there a way to make it resident in memory and always monitor my keystrokes for the sequence without the console?

由于Windows是一个多任务系统,每个没有被停止的进程都是常驻进程。你可以简单地编写一个无限循环,就像你已经做过的那样。

要监视所有击键,您可以尝试使用所谓的回调函数,它会为每个键盘事件调用。从 the MSDN page about SetWindowsHookEx() 开始了解更多信息。请注意,这不是初学者的任务。

Is there a better way to listen to a longer sequence of characters without nested ifs?

当然可以,使用有限状态机。由于解释会占用更多篇幅,请自行了解。您可以从 Wikipedia page on the matter.

开始