【发布时间】: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 完成。