示例#1
0
        public void Tick()
        {
            if (!ScaleEnabled.Value)
            {
                Scale.Visible = false;
                return;
            }

            if (Control.MouseButtons.HasFlag(MouseButtons.Left))
            {
                Status.OnNext($"監視を一時停止しています。");
                return;
            }

            var procName = TargetAppUtils.ProcessName;
            var hwndN    = TargetAppUtils.GetHwnd();

            if (hwndN is HWND hwnd)
            {
                try
                {
                    Scale.Visible = true;
                    var targetRect = WindowUtils.GetClientRectOnScreen(hwnd);

                    if (BeforeRect != targetRect)
                    {
                        var r = ScaleRectOnScreen(targetRect);
                        Scale.SetBounds(r.X, r.Y, r.Width, r.Height);

                        BeforeRect = targetRect;
                        Status.OnNext($"目盛りを移動しました。");
                    }
                    else
                    {
                        Status.OnNext($"アプリ {procName} を監視しています。");
                    }
                }
                catch (Exception)
                {
                    Scale.Visible = false;
                    Status.OnNext($"アプリ {procName} の監視が失敗しました。管理者権限が必要かもしれません。");
                }
            }
            else
            {
                Scale.Visible = false;
                Status.OnNext($"アプリ {procName} が見つかりません。");
            }
        }
示例#2
0
        public void Tick()
        {
            if (Control.MouseButtons.HasFlag(MouseButtons.Left))
            {
                Status.OnNext($"監視を一時停止しています。");
                return;
            }

            var procName = TargetAppUtils.ProcessName;
            var hwndN    = TargetAppUtils.GetHwnd();

            if (hwndN is HWND hwnd)
            {
                try
                {
                    var size = StretchUtils.GetWindowSize(hwnd);

                    if (BeforeSize != size)
                    {
                        StretchUtils.ResetAlwaysTop(hwnd);

                        var ptnVm     = size.Width >= size.Height ? Wide : Tall;
                        var stretched = StretchUtils.Stretch(hwnd, ptnVm.ToPattern());
                        BeforeSize = stretched == Size.Empty ? size : stretched;

                        Status.OnNext($"アプリ {procName} のウィンドウサイズを変更しました。");
                    }
                    else
                    {
                        Status.OnNext($"アプリ {procName} を監視しています。");
                    }
                }
                catch (Exception)
                {
                    Status.OnNext($"アプリ {procName} の監視が失敗しました。管理者権限が必要かもしれません。");
                }
            }
            else
            {
                Status.OnNext($"アプリ {procName} が見つかりません。");
            }
        }
        private Rectangle?MoveToNonOverlapPosition(Rectangle now)
        {
            try
            {
                if (now.IsEmpty)
                {
                    return(null);
                }

                var hwndN = TargetAppUtils.GetHwnd();
                if (!(hwndN is HWND hwnd))
                {
                    return(null);
                }

                return(OverlapUtils.GetNonOverlap(hwnd, now));
            }
            catch (Exception)
            {
                return(null);
            }
        }
示例#4
0
        private async Task <string> DoRecord()
        {
            try
            {
                State.OnNext(ModelState.Starting);
                Status.OnNext("準備しています...");

                var hwnd   = TargetAppUtils.GetHwnd() ?? throw new InvalidOperationException();
                var volume = GetVolume();

                using (var recorder = Recorder.CreateRecorder(new RecorderOptions()
                {
                    RecorderMode = RecorderMode.Video,
                    IsHardwareEncodingEnabled = true,
                    IsThrottlingDisabled = true,
                    IsLowLatencyEnabled = false,
                    IsMp4FastStartEnabled = false,
                    DisplayOptions = new DisplayOptions
                    {
                        WindowHandle = hwnd,
                    },
                    RecorderApi = RecorderApi.WindowsGraphicsCapture,
                    AudioOptions = new AudioOptions
                    {
                        IsAudioEnabled = true,
                        Channels = AudioChannels.Stereo,
                        Bitrate = AudioBitrate.bitrate_128kbps,
                        IsInputDeviceEnabled = false,
                        InputVolume = 0.0f,
                        OutputVolume = 1.0f / volume * 3, // TODO x3ってなんだよ
                    },
                    VideoOptions = new VideoOptions
                    {
                        BitrateMode = BitrateControlMode.UnconstrainedVBR,
                        Bitrate = 4 * 1000 * 1000,
                        Framerate = 120, // TODO これより下げるとコマ落ちする、なんでだ
                        IsFixedFramerate = false,
                        EncoderProfile = H264Profile.High
                    },
                    MouseOptions = new MouseOptions
                    {
                        IsMouseClicksDetected = false,
                        IsMousePointerEnabled = false,
                    },
                }))
                {
                    var filename = Path.Combine(SaveFolder.Value, $"{DateTime.Now:yyyy-MM-dd HH-mm-ss}.mp4");

                    recorder.Record(filename);
                    State.OnNext(ModelState.Recording);
                    Status.OnNext("録画を開始しました。");

                    await EndRecord;

                    State.OnNext(ModelState.Stopping);
                    recorder.Stop();
                    Status.OnNext("録画を終了しました。");

                    return(filename);
                }
            }
            finally
            {
                State.OnNext(ModelState.Ready);
            }
        }