0

我一直对TSR 程序的工作原理很感兴趣,所以我决定开始创建一个极其原始的程序。

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

一些笔记,该程序在任务管理器中占用了我至少 15% 的 CPU,为什么?我尝试将按键与27ESC 中的按键进行比较,但没有成功。

#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 程序,它自己加载到内存中,我在没有控制台的情况下丢失了它,不得不使用任务管理器来杀死它,有没有办法让它驻留在内存中并始终在没有控制台的情况下监视我的击键序列。

有没有更好的方法可以在没有嵌套 s 的情况下收听更长的字符序列,if更长的序列会变得难看。

4

1 回答 1

2

为什么程序在任务管理器中占用了我至少 15% 的 CPU?

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

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

有没有办法让它驻留在内存中,并在没有控制台的情况下始终监视我的击键序列?

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

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

有没有更好的方法来收听没有嵌套ifs 的更长的字符序列?

当然,使用有限状态机。由于解释将占用比适当更多的空间,请您自己了解这一点。您可以从Wikipedia 页面开始了解此事

于 2021-01-08T13:18:56.240 回答