解决 关键拦截

Rukusdm.

成员
加入
5月12日,2020年
消息
5
编程经验
1-3
你好。我构建一个语音识别程序(这是工作),它将在游戏中进行某些功能,但我希望有一个将激活识别的键,然后禁用它释放时的识别。例如左控制键。很多年后我在C ++中做到了这一点,但我不能记住它是如何完成的。
我在Microsoft Visual Studio 2019(免费版)中使用C#。任何帮助都得到了赞赏。
 

Rukusdm.

成员
加入
5月12日,2020年
消息
5
编程经验
1-3
此外,它是C #Windows窗体应用程序。我对飞行模拟器进行了很长几年,您可以与您的虚拟公司讨论,以设定自动驾驶仪高度,速度,标题等。您还可以拨打启动,出租车和前起飞的清单。这是如此多年,我丢失了代码哈哈。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
你要求的是矛盾的。您正在说您希望在游戏中使用语音识别来执行任务。无关紧要这些任务是......然后说你想在游戏窗口没有焦点或不是屏幕上的父窗口时进行。什么是那个点?

如果您想在游戏中使用它,那么您需要获取游戏窗口的句柄,挂钩它并侦听游戏窗口的密钥笔划,并将其发送回到您的表单。这将是从您自己的C#WinForms应用程序完成的。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
I think what our OP was doing was calling the Win32AP GetAsyncKeyState() in C++ and likely just PInvoking the same from within WinForms. If I'm not mistaken this API can be called and it'll give keyboard state even if the calling program doesn't have the input focus. The next alternative is to install a global keyboard hook -- which was common during the Windows XP days, but have become harder to get working with tighter Windows security.

无论如何,我对OP的意图的理解是他正在寻找一个基本上是一个拐杖谈话的按钮 - 你把它推下来谈谈 - 就像一些现代游戏系统一样。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
OP的应用程序可以提供我猜的侦听器,并在游戏窗口中侦听击键,但这是通过挂钩完成的。我可能会站在这里纠正,但我认为这不可能通过在没有挂钩的情况下使用特定的API来实现这一目标,至少几年前是不可能的几年前,当我插入基于DirectX的基础应用程序时,我是旧工作的。我需要挂钩窗口的地方,并侦听来自该全屏应用程序的关键事件。当我在这个项目上工作时,我需要挖掘该文件夹,以查看我使用的API。 (如果我还有它。)
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
这是一个快速演示:
C#:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ConsoleTest
{
    class ConsoleShell
    {
        [DllImport("user32.dll")]
        static extern short GetAsyncKeyState(Keys vKey);

        public static void Main()
        {
            do
            {
                if (IsKeyPressed(Keys.LShiftKey))
                    Console.WriteLine($"{DateTime.Now}: LSHIFT pressed");

                if (IsKeyPressed(Keys.RShiftKey))
                    break;
            } while (true);

            bool IsKeyPressed(Keys key) => (GetAsyncKeyState(key) & 0x8000) != 0;
        }
    }
}

编译并运行上面的控制台程序。满足自己,键盘正在检测到左移键压机。没有将焦点放在另一个窗口和开始类型上。当您按下左移键时,即使窗口没有输入焦点,控制台程序仍将报告按键。
 

Rukusdm.

成员
加入
5月12日,2020年
消息
5
编程经验
1-3
谢谢你的意见。我会看看代码。在我以前的应用程序中,它没有依赖于其他应用焦点,它刚收到了击键信息,并没有焦点。正如我所提到的那样,我不记得那么ID如何(8到10年前)。想做的是寻找特定的键,并在该键保持下激活语音识别。
 

Rukusdm.

成员
加入
5月12日,2020年
消息
5
编程经验
1-3
Here's a quick demo:
C#:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ConsoleTest
{
    class ConsoleShell
    {
        [DllImport("user32.dll")]
        static extern short GetAsyncKeyState(Keys vKey);

        public static void Main()
        {
            do
            {
                if (IsKeyPressed(Keys.LShiftKey))
                    Console.WriteLine($"{DateTime.Now}: LSHIFT pressed");

                if (IsKeyPressed(Keys.RShiftKey))
                    break;
            } while (true);

            bool IsKeyPressed(Keys key) => (GetAsyncKeyState(key) & 0x8000) != 0;
        }
    }
}

编译并运行上面的控制台程序。满足自己,键盘正在检测到左移键压机。没有将焦点放在另一个窗口和开始类型上。当您按下左移键时,即使窗口没有输入焦点,控制台程序仍将报告按键。

谢谢!这是伎俩 :)
 
最佳 底部