コード例 #1
0
ファイル: CropWindow.cs プロジェクト: AiHaibara/Trans
        private static void Show(object sender, EventArgs e)
        {
            Thread.Sleep(200);
            //if (MainWindow.Instance.WindowState != WindowState.Minimized)
            //    return;
            if (flag == false)
            {
                return;
            }
            flag = false;
            Window window = new Window();

            window.Owner       = null;
            window.Cursor      = Cliper.Instance;
            window.ResizeMode  = ResizeMode.NoResize;
            window.WindowStyle = WindowStyle.None;
            //window.WindowState = WindowState.Maximized;
            var canvas = new Canvas();

            canvas.Background = new SolidColorBrush(Colors.Transparent);
            System.Windows.Shapes.Path path = new System.Windows.Shapes.Path();
            var rectangle = new RectangleGeometry();

            path.Data   = rectangle;
            path.Stroke = new SolidColorBrush()
            {
                Color = Colors.Red, Opacity = 1f
            };
            window.Content = canvas;
            //var scale=getScalingFactor();
            BitmapSource source = ScreenCapture.CopyScreen();

            System.Windows.Controls.Image image = null;
            window.Width  = SystemParameters.PrimaryScreenWidth;
            window.Height = SystemParameters.PrimaryScreenHeight;
            window.Left   = 0;
            window.Top    = 0;
            using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
            {
                float dpiX = 96 / graphics.DpiX;
                float dpiY = 96 / graphics.DpiY;
                Data.GlobalData.DpiScale = new DpiScale(Data.GlobalData.ScreenHeight / (graphics.VisibleClipBounds.Height * dpiY), Data.GlobalData.ScreenWidth / (graphics.VisibleClipBounds.Width * dpiX));
                //image = new System.Windows.Controls.Image() { Source = source, SnapsToDevicePixels = true, Height =graphics.VisibleClipBounds.Height*dpiY, Width=graphics.VisibleClipBounds.Width*dpiX };
                image = new System.Windows.Controls.Image()
                {
                    Source = source
                };
                image.Width  = SystemParameters.PrimaryScreenWidth;
                image.Height = SystemParameters.PrimaryScreenHeight;
                //RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.HighQuality);
                canvas.Children.Add(image);
            }
            canvas.Children.Add(path);
            //System.Windows.Shapes.Rectangle rectangle = new System.Windows.Shapes.Rectangle();
            System.Windows.Point?start = null;
            System.Windows.Point?end   = null;
            window.MouseDown += (s, e) =>
            {
                e.Handled = true;
                window.CaptureMouse();
                start = e.GetPosition(window);
                //start = new System.Windows.Point(Math.Max(0d, start.Value.X),Math.Max(0d, start.Value.Y));
                Canvas.SetLeft(path, start.Value.X);
                Canvas.SetTop(path, start.Value.Y);
            };
            window.MouseMove += (ss, ee) =>
            {
                ee.Handled = true;
                if (start.HasValue)
                {
                    end = ee.GetPosition(window);
                    //end = new System.Windows.Point(Math.Max(0d, end.Value.X), Math.Max(0d, end.Value.Y));
                    Canvas.SetLeft(path, Math.Min(start.Value.X, end.Value.X));
                    Canvas.SetTop(path, Math.Min(start.Value.Y, end.Value.Y));
                    rectangle.Rect = new Rect(
                        start.Value.X < end.Value.X ? start.Value : end.Value,
                        start.Value.X < end.Value.X ? end.Value : start.Value);
                    canvas.InvalidateVisual();
                }
                //rectangle.Width = Math.Max(0,eee.GetPosition(window).X - sx);
                //rectangle.Height = Math.Max(0,eee.GetPosition(window).Y - sy);
            };
            window.MouseUp += (sss, eee) =>
            {
                eee.Handled = true;
                window.ReleaseMouseCapture();
                if (start.HasValue && end.HasValue)
                {
                    ScreenCapture.SaveImage(source, new Int32Rect(start.Value.X < end.Value.X ? (int)start.Value.X : (int)end.Value.X,
                                                                  start.Value.Y < end.Value.Y ? (int)start.Value.Y:(int)end.Value.Y,
                                                                  (int)rectangle.Rect.Width, (int)rectangle.Rect.Height));
                    window.Cursor = Cursors.Arrow;
                }

                //InteropMethods.SetForegroundWindow(current);

                source       = null;
                image.Source = null;
                window.Close();
                Do(rectangle.Rect.Width);
                //MainWindow.Instance.WindowState = WindowState.Normal;
            };
            //window.Deactivated += (aa, bb) =>
            //{
            //    Window window = (Window)aa;
            //    window.Topmost = true;
            //};
            //window.ShowActivated = false;
            //var current = InteropMethods.GetForegroundWindow();
            window.ShowActivated = false;
            window.Topmost       = true;
            window.Show();
            var handle  = new WindowInteropHelper(window).Handle;
            int exstyle = (int)InteropMethods.GetWindowLong(handle, InteropMethods.GWL_EXSTYLE);

            InteropMethods.SetWindowLong(handle, InteropMethods.GWL_EXSTYLE, (IntPtr)(exstyle | ((int)InteropMethods.WS_EX_NOACTIVATE | ((int)InteropMethods.WS_EX_TOOLWINDOW))));
            //InteropMethods.SetForegroundWindow(current);
            //InteropMethods.ShowWindow(current, 9);
            //InteropMethods.SetWindowPos(current, 0, 0, 0, 0, 0, InteropMethods.SWP_NOZORDER | InteropMethods.SWP_NOSIZE | InteropMethods.SWP_SHOWWINDOW);
        }