按任意键退出,如何实现

gtb1984 2007-06-15 01:39:13
void PrintRGB(void)
{
int i,j;
int s[6];
int Color;
int 1;
POINT Point;

while(1)
{

HDC hDC = GetWindowDC(NULL); //得到鼠标坐标X,Y值
GetCursorPos(&Point);
Color = GetPixel(hDC,Point.x,Point.y); //得到该点RGB值

for(i=0; i<6; i++) //将RGB值转换成可读的16进制数
{
if(i%2 == 0)
{
s[i+1] = Color%16;
Color = Color/16;
}
else if(i%2 == 1)
{
s[i-1] = Color%16;
Color = Color/16;
}
}

printf("R: %x%x G: %x%x B: %x%x \r",s[0],s[1],s[2],s[3],s[4],s[5],s[6]);//打印

ReleaseDC(NULL,hDC); //释放

for( j=0;j<100000000;j++ );//延时


}

}

以上是代码运行后是个死循环,按任意键退出,如何实现??
...全文
2101 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2007-06-15
  • 打赏
  • 举报
回复
一般不要用死循环来控制,最好是有一个循环条件:
bool isQuit = false; // 初始时,不退出循环
.
.
.
while (!isQuit) {
...
}
.
.
.
键盘事件处理:
按下任一键时,设置isQuit = true;
这样,while循环每次都是判断isQuit,如果是true时,就退出了。
也可以用while(1),但这样在while循环中就要用如:if (isQuit) break;
huashizhixin 2007-06-15
  • 打赏
  • 举报
回复
c = bioskey(1); //参数要为 1
if(c == 283) //283 为 ESC 键
exit(0);
改为:
c = bioskey(1); //参数要为 1
if(c != 0) //283 为 ESC 键
exit(0);
huashizhixin 2007-06-15
  • 打赏
  • 举报
回复
c = bioskey(1); //参数要为 1
if(c == 283) //283 为 ESC 键
exit(0);
改为:
c = bioskey(1); //参数要为 1
if(c == 1) //283 为 ESC 键
exit(0);
huashizhixin 2007-06-15
  • 打赏
  • 举报
回复
函数名: bioskey
功 能: 直接使用BIOS服务的键盘接口
用 法: int bioskey(int cmd);
程序例:
#include <stdio.h>
#include <bios.h>
#include <ctype.h>
#define RIGHT 0x01
#define LEFT 0x02
#define CTRL 0x04
#define ALT 0x08
int main(void)
{
int key, modifiers;
/* function 1 returns 0 until a key is pressed */
//翻译:用 1 作参数,直到有键按下,否则 函数return 0
while (bioskey(1) == 0);
/* function 0 returns the key that is waiting */
//翻译:0这个参数可以得到刚刚按下的键的代码.
key = bioskey(0);
/* use function 2 to determine if shift keys were used */
//翻译:当用 2 作参数的时候,可以确定是否用了shift键.
modifiers = bioskey(2);
if (modifiers)
{
printf("[");
if (modifiers & RIGHT) printf("RIGHT");
if (modifiers & LEFT) printf("LEFT");
if (modifiers & CTRL) printf("CTRL");
if (modifiers & ALT) printf("ALT");
printf("]");
}
/* print out the character read */
if (isalnum(key & 0xFF))
printf("'%c'\n", key);
else
printf("%#02x\n", key);
return 0;
}
这些都是从 C函数速查 中找的,大家可以从网上搜一下.
bioskey()是返回键盘状态的基本函数,它拥有3个参数
函数原型为:

int bioskey(int cmd)

其中cmd有3个参数:0,1,2

各参数的用法为:

当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。它返
回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存
放该字符的ASCII码;对于特殊键(如方向键、F1~F12等等),低8位为0,高8位字
节存放该键的扫描码。
cmd = 1:
当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回
0。
cmd = 2:
当cmd是2,bioskey()返回Shift、Ctrl、Alt、ScrollLock、NumLock、CapsLock、
Insert键的状态。各键状态存放在返回值的低8位字节中。
字节位 含义
0 右边Shift键状态
1 左边Shift键状态
3 Ctrl键状态
4 Alt键状态
5 ScrollLock键状态
6 NumLock键状态
7 CapsLock键状态
8 Insert键状态
bioskey函数

函数原型: int bioskey(int cmd);

函数功能:

利用函数bioskey可以实现三种功能,参数cmd为要实现的功能号,值只能为0、1、2
,具

体含义如下:

0:在系统中有一个按键队列,所有的键盘按键都在这里排成队。该功能就是如果按
键队

列中有按键,那么读取队列首位的按键,并返回按键值;否则等待键盘按键出现。(


中按键值的高字节为扫描码,低字节为ASCII码)

1:如果按键队列中没有按键,那么返回零,否则返回非零。

2:返回特殊按键Shift、Ctrl、Alt等键的按键状态

bioskey函数用于从内存中读取一个按键的scancode值.
格式是: int bioskey(int cmd)
参数cmd取值:
0: 读取scancode,并从内存中删除,如果没有按键则等待.
1: 读取scancode,但不从内存中删除(其它函数可以继续使用),如果无按键则返回0
2: 返加shift alt ctrl键的状态
按下shift返回1,按下ctrl返回4,按下alt返回8,
如果是 shift+ctrl 则返回5(相加),依此类推....
下面是一个例子:
#include <bios.h>
main()
{
while(!kbhit())
{
printf("\n%d,%d",bioskey(0),bioskey(2));
}
}
注意:这是一个死循环,因为参数0表示接收按键码,但将其清除,所以kbhit()函数就
接收不到按键了.
可按ctrl+break组合键来终止这个程序.
然后将 bioskey(0)改为 bioskey(1),
如果不按键将显示0,若按键则立即结束(为什么?呵呵,看前面的解释)
dagouzi 2007-06-15
  • 打赏
  • 举报
回复
TC 2.0 下可用 bioskey(int)这个函数 :
__________________________________________________
bioskey: keyboard interface

int bioskey(int cmd);

Prototype in bios.h

cmd Action
0 Return key scancode from buffer and
delete it from the buffer. Wait for the
next key if the buffer is empty.
1 Return key scancode from buffer, but do
not delete it from the buffer. Return 0
if the buffer is empty.
2 Return the BIOS shift state flags.
_________________________________________________________________
#include<dos.h>
#include<bios.h>
main(){
int c;
while(1){
c = bioskey(1); //参数要为 1
if(c == 283) //283 为 ESC 键
exit(0);
HDC hDC = GetWindowDC(NULL); //得到鼠标坐标X,Y值
GetCursorPos(&Point);
Color = GetPixel(hDC,Point.x,Point.y); //得到该点RGB值

for(i=0; i<6; i++) //将RGB值转换成可读的16进制数
{
if(i%2 == 0)
{
s[i+1] = Color%16;
Color = Color/16;
}
else if(i%2 == 1)
{
s[i-1] = Color%16;
Color = Color/16;
}
}

printf("R: %x%x G: %x%x B: %x%x \r",s[0],s[1],s[2],s[3],s[4],s[5],s[6]);//打印

ReleaseDC(NULL,hDC); //释放

for( j=0;j<100000000;j++ );//延时

}
}
ouyh12345 2007-06-15
  • 打赏
  • 举报
回复
把PrintRGB改造成线程
while(run)
然后捕捉键盘消息,结束循环

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧