【问题标题】:C Detect when user is typingC 检测用户何时输入
【发布时间】:2020-12-18 17:33:51
【问题描述】:

我想知道 C 中是否有一种方法可以检测用户何时输入。 我实际上阅读了这篇文章C detect user typing characters in stdin,但我找不到在 Windows 操作系统中将控制台从行模式切换到字符模式的方法......

如它所说的“ncurses”库是唯一的方法吗?... 我不能像在 java 中那样创建一个观察“输入”流的线程吗?

我只需要“事件处理程序”,我的其余代码将通过 Winsock 向客户端发送一条消息,例如 Whatsapp 之类的“USER_NAME 正在键入”...

有什么办法吗?

【问题讨论】:

  • 使用 Windows 操作系统?
  • 是的,在 Linux 中,该链接显示了如何操作,但在 Windows (OS) 中没有
  • 你可以试试这个projectpluto.com/win32a.htm

标签: c chat


【解决方案1】:

如果使用 Windows,则可以使用 GetAsyncKeyState()。它在Windows.h 中定义和实现,并使用User32.libUser32.dll 实现。它不仅检测按键点击,还提供按键状态和按键点击顺序的信息:

确定在函数执行时某个键是向上还是向下 调用,以及在上一次调用后是否按下了键 GetAsyncKeyState。

它还能够处理序列的击键,包括virtual keys的击键,如下所示:

一个简短的例子:

short state=0;
short state1=0;

state = GetAsyncKeyState(VK_CONTROL);
if (0x80000000 & state) //check instantaineous state of key
{
    state = GetAsyncKeyState(VK_SHIFT); 
    if (0x80000000 & state) //check instantaneous state of key
    {
        state = GetAsyncKeyState('h'); 
        state1 = GetAsyncKeyState('H'); 
        if ((0x80000000 & state) || 
            (0x80000000 & state1))

此特定示例是捕获修改后的键单击序列的摘录,但该函数可用于简单地捕获任何按下的键。

【讨论】:

  • 好的,所以通过这段代码我会知道用户是否按下了一个键然后发送我的消息对吗?我想我需要一个线程来解决这个问题吗?
  • @SimoneDeLuca - 在我的实现中,我不需要使用单独的线程出于我的目的,我只是运行它以允许用户设置状态。但是是的,它也可以在单独的线程中使用。\
【解决方案2】:

听起来像“kbhit”可能适合你。 There is 就是一个例子。

【讨论】:

  • 这是一个很好的解决方案。如果包含一个小的示例代码,答案将会大大改善。这可以防止当/如果链接失效时答案变得无用。
  • 非常感谢您,我想我会选择您的代码而不是 @ryyker 的代码,因为我需要知道是否按下了键盘上的任何键,而不是像 GetAsyncKeyState 方法这样的特定键想要。我将把它放在 scanf 指令之前启动的线程中。请告诉我这是否可以成为您的意见的一个很好的解决方案...
  • 我个人不经常使用khbit功能,前阵子才看到。您的以下解决方案可能有点棘手,但应该可以工作。很高兴它有帮助。你是对的@ryyker,这次我不想复制和粘贴其他现有的解决方案,但下次我会改进我的解决方案,谢谢。
  • 如果你想知道,我不是反对票。在这种情况下,因为 kbhit() 很容易被搜索到,所以不值得 IMO 否决。但是提出了包含一个示例而不是链接的建议,因为大多数访问该站点的人都认为它很重要。正如所解释的 - 链接消失。顺便说一句,从另一个站点剪切和粘贴示例是没有错的,只要该站点被授予信誉。这个答案将被一次又一次地访问。如果你稍微改进一下,它就有更高的获得投票的可能性。
猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多