private void timer_Elapsed(object sender, EventArgs e)
        {
            _timer.Stop(); // 途中の処理が重いため、タイマーをいったん止める
            lock (_lockObject)
            {
                _tickCount += _timer.Interval;

                // ここからプロセス間通信&UI操作(重い)
                //WPFButtonBase playButton = new WPFButtonBase(_root.IdentifyFromLogicalTreeIndex(0, 4, 3, 6, 3, 0, 3, 0));
                WPFButtonBase             playButton = new WPFButtonBase(_root.IdentifyFromLogicalTreeIndex(0, 4, 3, 6, 3, 0, 0, 0, 1, 3, 0));
                var                       d          = playButton.LogicalTree();
                System.Windows.Visibility v          = (System.Windows.Visibility)(d[2])["Visibility"]().Core; // [再生]の画像の表示状態
                                                                                                               // ここまで

                if (v != System.Windows.Visibility.Visible && !_isRunning)
                {
                    _isRunning = true;
                }
                else
                // 再生開始から 500 ミリ秒程度経過しても再生ボタンがうまく確認できなかった場合にも完了とみなす
                if (v == System.Windows.Visibility.Visible && (_isRunning || (!_isRunning && _tickCount > 500)))
                {
                    if (_queue.Count == 0)
                    {
                        StopSpeech();
                        return; // タイマーが止まったまま終了
                    }
                    else
                    {
                        // 喋るべき内容が残っているときは再開
                        string t = _queue.Dequeue();
//                        WPFTextBox textbox = new WPFTextBox(_root.IdentifyFromLogicalTreeIndex(0, 4, 3, 6, 3, 0, 2));
                        WPFTextBox textbox = new WPFTextBox(_root.IdentifyFromLogicalTreeIndex(0, 4, 3, 6, 3, 0, 0, 0, 1, 2));
                        textbox.EmulateChangeText(t);

                        playButton.EmulateClick();
                        _isPlaying = true;
                        _isRunning = false;
                        _tickCount = 0;
                    }
                }

                _timer.Start();
            }
        }
示例#2
0
        public async Task Save(string msg, string fileName)
        {
            await Task.Run(async() =>
            {
                try
                {
                    //フォーカスしないようにする
                    //ShowWindow(mainWindowHandle.ToInt32(), SW_HIDE);
                    await Task.Delay(100);

                    //再生完了待機
                    while (!saveButton.IsEnabled)
                    {
                        Console.WriteLine("saveBtn is not enabled");
                        await Task.Delay(100);
                    }

                    talkTextBox.EmulateChangeText(msg);

                    var async = new Async();
                    saveButton.EmulateClick(async);
                    //名前を付けて保存ダイアログ
                    var saveFileWindow = uiTreeTop.WaitForNextModal();
                    var saveFileDialog = new NativeMessageBox(saveFileWindow);

                    //ファイル名を入力
                    //右上の検索欄にも入力されてしまうが無視
                    var edits = saveFileDialog.Window.GetFromWindowClass("Edit");
                    foreach (var t in edits)
                    {
                        var edit = new NativeEdit(t);
                        edit.EmulateChangeText(fileName);
                    }

                    saveFileDialog.EmulateButtonClick("保存(&S)");
                    //saveFileWindow.WaitForDestroy();

                    //出力状況を表示するダイアログの表示を待つ
                    Console.WriteLine("waiting for showing progress window");
                    var progressWindow = uiTreeTop.WaitForNextModal();
                    if (progressWindow == null)
                    {
                        progressWindow = uiTreeTop.WaitForNextModal();
                    }
                    Console.WriteLine("showed " + progressWindow.GetWindowText());

                    var tokenSource = new CancellationTokenSource();
                    var task        = new TaskFactory().StartNew(() =>
                    {
                        //完了通知ダイアログの表示を待つ
                        Console.WriteLine("wationg for showing saving complete window");
                        var completeWindow = progressWindow.WaitForNextModal();
                        if (completeWindow != null)
                        {
                            Console.WriteLine("showed " + completeWindow.GetWindowText());
                            Console.WriteLine(DateTime.Now);
                            try
                            {
                                var completeDialog = new NativeMessageBox(completeWindow);
                                completeDialog.EmulateButtonClick("OK");
                                Console.WriteLine("wating for destroying");
                                completeWindow.WaitForDestroy();
                                Console.WriteLine("finish");
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }
                        }
                    }, tokenSource.Token);
                    try
                    {
                        Console.WriteLine(DateTime.Now);
                        if (!task.Wait(5000))
                        {
                            tokenSource.Cancel();
                            Console.WriteLine("timeout");
                            Console.WriteLine(DateTime.Now);
                            var windows = WindowControl.GetTopLevelWindows(uiTreeTop.App);
                            foreach (var window in windows)
                            {
                                Console.WriteLine(window.GetWindowText());
                                var btnList = window.LogicalTree().ByType <Button>();
                                var count   = btnList.Count;
                                for (int i = 0; i < count; i++)
                                {
                                    var btn        = new WPFButtonBase(btnList[i]);
                                    var btnTxtList = btn.LogicalTree(TreeRunDirection.Descendants).ByType <TextBlock>();
                                    if (btnTxtList.Count == 1)
                                    {
                                        var btnTxt = new WPFTextBlock(btnTxtList.Single());
                                        Console.WriteLine(btnTxt.Text);
                                        if (btnTxt.Text.Equals("キャンセル"))
                                        {
                                            btn.EmulateClick();
                                        }
                                    }
                                }
                            }

                            var completeWindow = progressWindow.WaitForNextModal();
                            Console.WriteLine("showed2 " + completeWindow.GetWindowText());
                            Console.WriteLine("2" + DateTime.Now);
                            var completeDialog = new NativeMessageBox(completeWindow);
                            completeDialog.EmulateButtonClick("OK");
                            Console.WriteLine("wating for destroying2");
                            completeWindow.WaitForDestroy();
                            Console.WriteLine("finish2");
                        }
                    }
                    catch (AggregateException)
                    {
                        //タスクがキャンセルされた
                        Console.WriteLine("task was canceled");
                        var completeWindow = WindowControl.FromZTop(uiTreeTop.App);
                        Console.WriteLine("showed3 " + completeWindow.GetWindowText());
                        var completeDialog = new NativeMessageBox(completeWindow);
                        completeDialog.EmulateButtonClick("OK");
                        Console.WriteLine("wating for destroying3");
                        completeWindow.WaitForDestroy();
                        Console.WriteLine("finish3");
                    }

                    if (!async.IsCompleted)
                    {
                        try
                        {
                            Console.WriteLine("wating for async finish");
                            async.WaitForCompletion();
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e);
                        }
                    }
                }
                finally
                {
                    //ShowWindow(mainWindowHandle.ToInt32(), SW_MINIMIZE);
                    Console.WriteLine("complete saving");
                }
            });
        }