4

私のプログラムが出力として与えることを彼女に言わせるために、仮想アシスタントに接続しようとしています。

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

sendmessage の使用は機能しますが、彼女が話している間、私のプログラムの残りの部分をブロックします。

ポストメッセージが機能せず、メッセージが仮想アシスタントに届きません。

それで、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);
    }

ここでの結果は、仮想アシスタントが話すということですが、プログラムはタイムアウトの間ブロックされたままで、私のデバッガーはスタックの不均衡の問題を引き起こします。

仮想アシスタントが話している間、プログラムを実行し続ける方法について誰か提案がありますか?

プログラムは、あなたが何をしているかについて文章を返しますが、特定のアラームやリマインダーを返すことができるスレッドも実行しています. したがって、仮想アシスタントが話すたびにブロックされるプログラムは役に立ちません。

4

1 に答える 1

1

メソッドを別のスレッドで実行してみてください。

スレッドの使用とスレッド化

もちろん、最近は自分のスレッドを管理する代わりに async / await パターンを使用しています。

async と await を使用した非同期プログラミング

于 2012-06-12T12:52:24.227 に答える