c# - 使用 SendMessageTimeout

标签 c# interop sendmessage postmessage

我正在尝试连接到虚拟助手,让她说出我的程序作为输出提供的内容。

MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(v=vs.85).aspx

使用 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);
    }

这里的结果是虚拟助手会说话,但程序在超时期间仍然阻塞,我的调试器给我一个 stackimbalance 问题。

有没有人对如何在虚拟助手说话时保持程序运行有建议?

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

最佳答案

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

Using threads and threading

当然,这些天我使用异步/等待模式而不是管理我自己的线程。

Asynchronous programming with async and await

关于c# - 使用 SendMessageTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10996992/

相关文章:

java - 使用 clojure 生成 java bean

javascript - 使用 postMessage API 时如何确保弹出窗口已完全加载?

c++ - 使用 SendMessage 获取垃圾来填充列表框

java - 如何从 Clojure 中的类调用具体化的 Java 接口(interface)?调用电话无法解决

c# - 我不明白如何使用 SendMessage 或 PostMessage 调用

c# - 将 datauri pdf 转换为文件以附加到电子邮件

c# - 为什么当我将 CommandParameter 设置为某个 Binding 时我的 ICommand.CanExecute(object) 参数为空,但当我将其设置为某个静态值时为非空?

c# - 如何验证 ADFS SAML token

c# - Azure 事件目录 |基于角色的授权

C# - Java 互操作