C语言 如何在一段时间内检测键盘是不是按下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 如何在一段时间内检测键盘是不是按下相关的知识,希望对你有一定的参考价值。

如题,就像俄罗斯方块一样,如何做到在一段时间内,若有键按下则做相应的动作,没按下就自由下落.
我是用VC 6.0的,刚学编程,很多东西不懂,希望各位指教.
1楼的只是等待输入,然后检测键盘按键,没有限制时间,
我想要的是如果一段时间都没按的话就做别的事.

#include <bios.h>
#include <stdio.h>
main()

int key;
for(;;)

if (bioskey(1)) /*有键按下,读取键值*/
key=bioskey(0);
else /*无键按下,返回0*/
key=0;
switch(key)
case 0: ...../*无按键,执行该操作*/
case 0xXXXXH:..../*不同键值,做不同处理*/
。。。。。




该程序段功能:
判断是否有键按下,若有进行不同操作,若无进行其他操作。

相关原理:
函数名: bioskey
功 能: 直接使用BIOS服务的键盘接口
函数原型:int bioskey (int cmd)
说明:bioskey()的函数原型在bios.h中
bioskey()完成直接键盘操作,cmd的值决定执行什么操作。

cmd = 1:
当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。

键盘有按键时,会把键值(扫描码)存入缓冲区,当需要判断是否有键按下时,扫描缓冲区,为空则无键按下,不为空则有键按下。注意:该功能并不清空缓冲区。

cmd = 0:
当cmd是0,bioskey()返回键盘键入的值。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ASCII码,高8位存放该键的扫描码;对于特殊键(如方向键、F1~F12等等),低8位为0,高8位字节存放该键的扫描码。

其操作步骤为:
1.检测缓冲区是否有数据;
2.没有则继续第一步;
3.读取缓冲区第一个单元中的键盘输入
4.读取的扫描码
5.将已读取的键盘输入从缓冲区删除
参考技术A C语言实现的键盘检测:

/* 检测当前是否有键盘输入,并更新键值JR_KeyValue */
int JR_AnyKeys(void);

/* 返回键值ASCII码 或 对应自定义键值 */
int JR_GetKeyNum(void);

/* 检测指定键是否有按下 */
int JR_IsKeyDown(const int key);

BUG:在一次检测中多次调用函数JR_GetKeyNum()就会出错了。
FIX:把JR_KeyBoard.c文件中的JR_GetKeyNum()函数里面的第一句“JR_AnyKeys();”注释掉就可以了。
参考技术B 先获取时间,比较过期时间,以秒为单位, 参考技术C #include <bios.h>
#include <stdio.h>
main()

int key;
for(;;)
key=bioskey(0);
if (key==0x11b) /*按了ESC键*/
break;
else
printf("0x%x\n",key); /*打印出各键对对应的键值*/

参考技术D int key=0,i=0;
while(key==0&&i<100)

key=bioskey(0);
printf("%d\n",i);
++i;

我们如何检测用户是不是使用 MessageKit 按下键盘上的“发送/返回”按钮?

【中文标题】我们如何检测用户是不是使用 MessageKit 按下键盘上的“发送/返回”按钮?【英文标题】:How can we detect if user press the "Send/Return" button on keyboard with MessageKit?我们如何检测用户是否使用 MessageKit 按下键盘上的“发送/返回”按钮? 【发布时间】:2021-12-29 15:57:38 【问题描述】:

我希望用户在按下键盘上的“发送”按钮时也能够发送消息。对于 textField,我知道可以通过 delagte 来实现。但是谁能指出我如何在 MessageKit 中做到这一点?我无法在这里找到合适的方法。 提前致谢!

【问题讨论】:

【参考方案1】:

详细解释可以在MessageKit repo 上的example project 中找到。

实现点击发送按钮发送消息的代码sn-p,如下所示:

import UIKit
import MessageKit
import InputBarAccessoryView

class MyViewController: MessagesViewController 
    override func viewDidLoad() 
        super.viewDidLoad()
        messageInputBar.delegate = self //set the delegate to receive notifications from the `InputBarAccessoryView`
    


extension MyViewController: InputBarAccessoryViewDelegate 
    @objc internal func inputBar(_ inputBar: InputBarAccessoryView, didPressSendButtonWith text: String) 
        processInputBar(messageInputBar)
    
    
    private func processInputBar(_ inputBar: InputBarAccessoryView) 
        let components = inputBar.inputTextView.components
        inputBar.inputTextView.text = String()
        inputBar.invalidatePlugins()
        inputBar.inputTextView.resignFirstResponder() // Resign first responder for iPad split view
        DispatchQueue.global(qos: .default).async 
            DispatchQueue.main.async  [weak self] in
                guard let self = self else return
                self.insertMessages(components)
                self.messagesCollectionView.scrollToLastItem(animated: true)
            
        
    
    
    private func insertMessages(_ data: [Any]) 
        for component in data 
            if let string = component as? String 
                // Create a Message type and add it the the chat messages
                // let message = Message(sender: currentUser, messageId: UUID().uuidString, kind: .text(string))
            
            else if let image = component as? UIImage 
                let item = ImageMediaItem(image: image)
                // Create a Message type and add it the the chat messages
                // let message = Message(sender: currentUser, messageId: UUID().uuidString, kind: .photo(item))
            
        
    

【讨论】:

以上是关于C语言 如何在一段时间内检测键盘是不是按下的主要内容,如果未能解决你的问题,请参考以下文章

如何在一段时间内重复一个过程,直到按下输入?

如何检测是不是在 C++ 中按下了除特定键盘键之外的任何键盘键?

我们如何检测用户是不是使用 MessageKit 按下键盘上的“发送/返回”按钮?

c语言如何检测网络是不是连接

c语言,无向图如何检测是不是有环?

如何计算一个话题在一段时间内的趋势率?