Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 使用SendMessageTimeout_C#_Interop_Sendmessage_Postmessage - Fatal编程技术网

C# 使用SendMessageTimeout

C# 使用SendMessageTimeout,c#,interop,sendmessage,postmessage,C#,Interop,Sendmessage,Postmessage,我试图连接到一个虚拟助手,让她说出我的程序作为输出提供的内容 msdn: 使用sendmessage可以工作,但会在她讲话时阻止我程序的其余部分 Postmessage不起作用,消息不会到达虚拟助手 所以我发现SendMessageTimeout 代码: [DllImport("User32.dll")] public static extern int SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, ref C

我试图连接到一个虚拟助手,让她说出我的程序作为输出提供的内容

msdn:

使用sendmessage可以工作,但会在她讲话时阻止我程序的其余部分

Postmessage不起作用,消息不会到达虚拟助手

所以我发现SendMessageTimeout

代码:

    [DllImport("User32.dll")]
    public static extern int SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, ref COPYDATASTRUCT lParam, uint fuFlags, uint timeout);

    public void Speak(string s)
    {
        string json = @"{
        ""debug""   : ""on"",
        ""version"" : ""1.0"",
        ""priority"": ""2"",
        ""type""    : ""interaction"",
        ""interaction"" : {
                    ""interactionID"" : ""Agenda"",
                    ""actionID""      : ""Agenda"",
                    ""string"" : """ + s + @"""
                 }
        }";

        IntPtr hWnd = FindWindow(null, windowAnne);
        byte[] sarr = Encoding.Default.GetBytes(json);
        COPYDATASTRUCT cds;
        cds.dwData = (IntPtr) 100;
        cds.lpData = json;
        cds.cbData = sarr.Length + 1;
        SendMessageTimeout(hWnd, WM_COPYDATA, IntPtr.Zero, ref cds, 0x0000, 500);
    }
这里的结果是虚拟助手说话,但程序在超时期间仍然阻塞,我的调试器给了我一个堆栈不平衡问题

在虚拟助手讲话时,有人对如何保持程序运行有什么建议吗


该程序返回有关您正在做的事情的句子,但也有一个线程运行,可以返回某些警报和提醒。因此,每次虚拟助手讲话时被阻止的程序是无用的。

尝试在单独的线程中执行您的方法:

当然,现在我使用异步/等待模式,而不是管理自己的线程


为什么我没有想到线程?SendMessage本身现在工作正常。答案中的上述链接已断开。@MichaelPodlejska-在C#中,Async/Await现在可能是比管理自己的线程更好的选择,因此链接断开可能是件好事。不管怎样,断开的链接都是一件痛苦的事。你的pinvoke声明是错误的,它缺少lpdwResult参数。到目前为止,最简单也是最不容易出错的方法是使用.NET SpeechSynthesizer.SpeakAsync()方法。没有必要出错,我只是不需要它。语音合成器也是如此,因为语音是由虚拟助手程序(用Pascal编写)调节的。我所需要做的就是发送一条JSON消息。