【问题标题】:Create a simple memory resident program创建一个简单的内存驻留程序
【发布时间】:2021-01-08 11:24:34
【问题描述】:

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

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

【问题讨论】:

  • 在 Windows(和其他多任务操作系统)上,每个进程都有自己的输入队列。您需要使用键盘挂钩来监视程序没有焦点时发生的输入。
  • TSR 是一个 MS-DOS 的东西,这个概念在 Windows 中意义不大。这是如何在单任务系统中制作后台任务。如果没有按下任何键,则您的循环基本上是一个 while (1) {},它会占用 CPU。你到底想达到什么目的?
  • 只是想了解一个进程如何即使在后台出现时仍然可以监控正在发生的事情。
  • DOS 对此的回答是安装中断处理程序。 Windows 不会让你这样做。
  • Win32 API 调用了在多个事件上安装回调,在关键事件上也是如此。请访问 MSDN 并开始阅读。 @dratenik 这种方式键盘记录器非常简单。使用 AutoIt3 完成。

标签: c keystroke tsr


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 2015-01-18
    • 2014-11-18
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多