使用SendMessageTimeout

时间:2012-06-12 12:48:42

标签: 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问题。

有人建议如何在虚拟助手发言时保持程序正常运行吗?

程序会回复你正在做什么的句子,但也有一个运行的线程可以回馈某些警报和提醒。因此,每次虚拟助手讲话时被阻止的程序都没用。

1 个答案:

答案 0 :(得分:1)

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

How to: Create and Terminate Threads (C# Programming Guide)