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

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

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

请注意,程序在任务管理器中占用了至少 15% 的 CPU,为什么? 我尝试将击键与 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 程序,它自己加载到内存中,但我在没有控制台的情况下丢失了它,不得不使用任务管理器来杀死它,有没有办法让它驻留在内存中并始终监视我在没有控制台的情况下为序列击键。

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

wxryyb 回答:创建一个简单的内存驻留程序

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

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

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

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

由于 Windows 是一个多任务系统,每个未被停止的进程都是一个常驻进程。您可以像之前一样简单地编写一个无限循环。

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

有没有更好的方法可以在没有嵌套 if 的情况下收听更长的字符序列?

当然,使用有限状态机。由于解释会占用更多空间,因此请自行了解。您可以从 Wikipedia page on the matter 开始。

本文链接:https://www.f2er.com/1134992.html

大家都在问