Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中使用read()函数与stdin时区分剪贴板事件_C_Clipboard_Stdin_Differentiation - Fatal编程技术网

在c中使用read()函数与stdin时区分剪贴板事件

在c中使用read()函数与stdin时区分剪贴板事件,c,clipboard,stdin,differentiation,C,Clipboard,Stdin,Differentiation,我正在使用基于终端的文本编辑器,需要区分read()函数的输入文本是剪贴板粘贴文本还是键盘文本输入 #include <unistd.h> char read_key_input() { char ch; int read_count; while ((read_count = read(STDIN_FILENO, &ch, 1)) != 1) { // Handle error if any }

我正在使用基于终端的文本编辑器,需要区分read()函数的输入文本是剪贴板粘贴文本还是键盘文本输入

#include <unistd.h>

char read_key_input() {
    char ch;
    int read_count;

    while ((read_count = read(STDIN_FILENO, &ch, 1)) != 1)
    {
        // Handle error if any
    }
    
    return ch;
}

...

我更新了代码,一次检索多个字节(正如@AnttiHaapala所建议的),并处理每个字节。现在似乎足够满足我的文本编辑器的需要了。如果我更新,将发回。

好吧,你不能做你想做的事(可靠地)

剪贴板(通常)与某些显示服务器相关,例如或服务器(Weston)。X11可能有远程客户端(因此,剪贴板操作可能会很慢,如果穿越大洋的话)

某些Linux机器(可能是Stackoverflow的web服务器)不运行任何显示服务器

您可以编写GUI应用程序,例如使用或

您可以测试您的标准输入是否是具有功能的终端,或者(例如,对于标准输出,使用
isatty(STDIN\u FILENO)
isatty(STDOUT\u FILENO)

如果您的程序在作业或中运行,则标准输入将不是终端,甚至可能没有任何显示服务器在运行

您可以从的源代码中获得灵感,它可以检测何时有显示服务器可用(可能使用,例如of
“display”
…)


在Linux上,您可以
/dev/tty
(请参阅)访问您的终端。在某些情况下,它并不存在。

通常,您可以通过计算快速连续收到的字符数来区分这一点。因此,如果你的按键速度超过每分钟1000个字符,那么很可能是剪贴板粘贴。。。或者胡说八道

此外,如果您已将终端设置为原始模式,则可以轻松监控各个按键。同时使
read
一次接受多个字节-使用
read
这是在可用时不阻塞接收的最大字节数


这种交互式终端程序的一个例子是IPython,这里有两行分别键入:

In [1]: print("Hello")
Hello

In [2]: print("World")
World
这里一次粘贴:

In [3]: print("Hello")
   ...: print("World")
   ...:
Hello
World

请注意提示是如何不同的,并且程序仅在经过一个小延迟后单独按下Enter键后才运行。

Hey@jiten不确定是否选中了like 其按键输入逐个检测并检查其输入是否正确
或者它的即时批量输入。

这是唯一的选择吗因为我想在我正在使用的编辑器中也有快速的双按键功能。这可能会导致多次时差比较,例如,输入之间的时间<50毫秒?剪贴板文本:用户输入抱歉,这个问题与上下文无关,但您知道其他文本编辑器(如vim或ncurses library)如何区分吗?@JitenDevlani除了复制粘贴的2个字符外,您无法分辨快速双击键,但您是否介意。复制粘贴将是一段重要的文本。你可能会关心的唯一情况是,如果你正在编写一个类似“typespeed”的游戏,并试图确保玩家不会使用复制粘贴作弊,我想我也必须考虑到这一点,我的文本编辑器支持不同的模式(普通、插入、可视),就像vim一样。我不想让它在用户从剪贴板粘贴时执行一个命令,比如说
跳转到text
(可能绑定到一个组合键)。当文本来自剪贴板
时,它应该始终处于输入模式,就像vim
一样,然后可能是现实生活中的例子-是一个vim插件,如果键入字符之间的时间小于10ms,它会更改vim设置。如果我将终端置于原始模式,我是否必须检查标准输入是否为终端?如果是,我怎么做?isatty(标准文件号)?
In [3]: print("Hello")
   ...: print("World")
   ...:
Hello
World