怎么使C语言程序在后台运行并接收键盘输入?

如题所述

有点麻烦。
第一,你要会写DLL,检查,键盘过滤函数 WH_KEYBOARD,用SetWindowsHookEx()将其挂接在函数链首,用CallNextHookEx()把消息传给下一个函数。
键盘挂钩函数:
int FAR PASCAL KeyboardProc( int nCode,WORD wParam,DWORD lParam) {}
KeyboardProc--挂接函数名,该函数必须在模块定义文件中利用EXPORTS命令进行说明;
nCode决定挂接函数是否对当前消息进行处理;wParam和lParam为具体的消息内容。
第二,你要会写程序,调用那个钩子DLL
第三,你要让程序在背景运行。追问

请问这是WINDOWS编程的知识吗? 能不能直用C语言实现

追答

是WINDOWS编程。
要写 WIN32 API 程序。
不能用简单的C语言方法实现。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-29
利用死循环,就是利用循环控制语句,不断检查输入情况,还是我写个简单的程序给你看看吧,这里我用while循环举例
#include<stdio.h>
int main(void)
{
int i;
while(1)
{
printf("input i:",i);
scanf("%d",&i);
if(i==1)
printf("我很聪明\n");
else continue;
}
}
就是这样的,只要你输入i的值不是1,程序就一直循环,每次循环都判断新输入的是不是1,如果是就打印 我很聪明 并且继续循环,再次输入检查输入,一直这样下去,这就实现了程序在后台检查输入的情况,等待键盘输入追问

声明一下:我已经学了两年的C语言了 ,你试一下你这个程序在后台还能不能接收键盘输入把!

追答

喔,没在意写错,写的是有问题,但是我只是想说明什么叫后台输入控制程序,其实我这个程序还没写完整,因为后面还要很多 条件限制的,我只是说明下

第2个回答  2011-04-30
使用int kbhit(void)
-------------------
函数名:kbhit()(VC++6.0下为_kbhit())
功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
用 法:int kbhit(void);
包含头文件: include <conio.h>
------------------
检测到之后再用getch/getche等等函数取得按键,用getchar等会等到按回车再返回...
当然这只是命令行下的函数,而且linux下没有conio.h,需要其它等效代码替换,你可以搜下Net
-------------------
#include <conio.h>

int main()
{
int i,c;
char p[4]={ '|', '/', '-', '\\'};
for(i=0;;i++)
{
if(kbhit()==0){//没有按键
int n;
cprintf("\r%u %n",i,&n);
while(n++<20)putch('.');
cprintf(" %c",p[i/400%4]);
}else{//有按键
c=getch();
cprintf("\r ");
cprintf("\r%u>you press '%c' key, code %u.\n", i, (c==13)?10:c, c);
}
}
}
第3个回答  2011-05-04
#include<stdio.h>
#include<stdlib.h>

#define SIZE 4

struct student
{
char s_num[10];
char s_name[20];
char sex[2];
int age;
}stu[SIZE];

void input()
{
int i;
for(i=0;i<SIZE;i++)
{
printf("请输入第%d个学生的数据内容:学号,姓名,性别(男:M,女F),年龄\n",i+1);
scanf("%s%s%s%d",stu[i].s_num,stu[i].s_name,stu[i].sex,&stu[i].age);
}
}

void save()
{
int i;
FILE *fp;
if((fp=(fopen("c:\\stu_list.txt","wb")))==NULL)
{
printf("can not open file:stu_list!\n");
exit(0);
}
for(i=0;i<SIZE;i++)
{
if((fwrite(&stu[i],sizeof(struct student),1,fp))!=1)
{
printf("write error!\n");
fclose(fp);
exit(0);
}
}
fclose(fp);
}

void main()
{
input();
save();
}

关键错误在于:fclose(0);
应该改为 fclose(fp);
另外,团IDC网上有许多产品团购,便宜有口碑
第4个回答  2011-04-29
用管道啊,写个守护进程读取管道
输入的时候直接将要输入的东西>进那个管道
大体上是这样
if(fork()!=0)
exit(0);
mkfifo("/var/myfifo");
fp = fopen("/var/myfifo","r");
while(fread(....)){
...
}
输入的时候使用管道
echo hello >/var/myfifo这样就把hello输进去了
你能看懂吗追问

守护进程读取管道? 这又是什么?

追答

守护进程就是后台进程啊
你通过管道可以将键盘的输入传递过去
或者说我理解错了?你是要后台进程捕获键盘击键?
那你应该看看windows的HOOK,也就是钩子函数,或者linux的内核
纯C语言?嵌入汇编吗?要写键盘驱动?