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} が見つかりません。"); } }
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); } }
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); } }