예제 #1
0
 public static Image GetScreenshot(IntPtr hWnd)
 {
     IntPtr hdcScreen = WinAPI.GetDC(hWnd);
     IntPtr hdc = WinAPI.CreateCompatibleDC(hdcScreen);
     WinAPI.RECT area = new WinAPI.RECT();
     WinAPI.GetWindowRect(hWnd, ref area);
     
     IntPtr hBitmap = WinAPI.CreateCompatibleBitmap(hdcScreen, area.right - area.left, area.bottom - area.top);
     WinAPI.SelectObject(hdc, hBitmap);
     WinAPI.PrintWindow(hWnd, hdc, 0);
     Image resultOpaque = Image.FromHbitmap(hBitmap);
     WinAPI.DeleteObject(hBitmap);
     WinAPI.DeleteDC(hdc);
     IntPtr hRegion = WinAPI.CreateRectRgn(0, 0, 0, 0);
     WinAPI.RegionFlags f = (WinAPI.RegionFlags) WinAPI.GetWindowRgn(hWnd, hRegion);
     Region region = Region.FromHrgn(hRegion);
     WinAPI.DeleteObject(hRegion);
     Bitmap result = new Bitmap(resultOpaque.Width, resultOpaque.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
     Graphics g = Graphics.FromImage(result);
     g.Clear(Color.Transparent);
     if (f != WinAPI.RegionFlags.ERROR)
         g.SetClip(region, System.Drawing.Drawing2D.CombineMode.Replace);
     if (f != WinAPI.RegionFlags.NULLREGION)
         g.DrawImageUnscaled(resultOpaque, 0, 0);
     g.Dispose();
     region.Dispose();
     resultOpaque.Dispose();
     return result;
 }
 static MouseMoveToAreaOnWindow GetMouseMoveToWindow(WinAPI.RECT clickArea)
 {
     return(new MouseMoveToAreaOnWindow()
     {
         ClickArea = clickArea, WindowToClickTitle = "Smite (32-bit, DX9)"
     });
 }
예제 #3
0
파일: MainHub.cs 프로젝트: uvbs/bot-2016
        internal MainHub(Objects.Client c)
        {
            if (!WinAPI.IsIconic(c.TibiaProcess.MainWindowHandle))
            {
                this.StartPosition = FormStartPosition.Manual;
                WinAPI.RECT rect = new WinAPI.RECT();
                WinAPI.GetWindowRect(c.TibiaProcess.MainWindowHandle, out rect);
                this.Location = new Point(rect.left + 10, rect.top + 30);
            }
            this.Client = c;
            InitializeComponent();
            this.Icon = Properties.Resources.icon;

            if (!this.Client.HasLoadedProperties)
            {
                ObjectPropertiesLoader loader = new ObjectPropertiesLoader(this.Client);
                loader.ShowDialog();
                if (!loader.Finished)
                {
                    Environment.Exit(Environment.ExitCode);
                }
                loader.Dispose();
            }

            this.timerUpdate.Start();
        }
예제 #4
0
        public static void SubtractWindowBorders(IntPtr hwnd, ref WinAPI.RECT rc)
        {
            var b = new WinAPI.RECT(0, 0, 0, 0);

            AddWindowBorders(hwnd, ref b);
            rc.Left   -= b.Left;
            rc.Top    -= b.Top;
            rc.Right  -= b.Right;
            rc.Bottom -= b.Bottom;
        }
예제 #5
0
        //private GraphicsPath CreateRoundedFormRect(bool correction)
        //{
        //    Rectangle rect = new Rectangle(Point.Empty, this.Size);
        //    return GraphicsPathHelper.CreateRoundedRect(rect, Radius, Round, correction);
        //}

        /// <summary>
        /// 判断所接收到的 wm_nc-calc-size 消息是否指示窗体即将最小化
        /// </summary>
        private bool IsAboutToMinimize(WinAPI.RECT rect)
        {
            if (rect.Left == -32000 && rect.Top == -32000)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #6
0
파일: MainHub.cs 프로젝트: uvbs/bot-2016
 private void trayIcon_DoubleClick(object sender, EventArgs e)
 {
     if (!WinAPI.IsIconic(this.Client.TibiaProcess.MainWindowHandle))
     {
         this.StartPosition = FormStartPosition.Manual;
         WinAPI.RECT rect = new WinAPI.RECT();
         WinAPI.GetWindowRect(this.Client.TibiaProcess.MainWindowHandle, out rect);
         this.Location = new Point(rect.left + 10, rect.top + 30);
     }
     this.Show();
     trayIcon.Visible = false;
 }
예제 #7
0
        public void Render()
        {
            try {
                var str  = (string)Messages[Messages.Count - 1];
                var font = new Font("VCR OSD Mono", 32);

                var hWnd = WinAPI.GetDesktopWindow();
                var gfx  = Graphics.FromHwnd(hWnd);

                var textSz = gfx.MeasureString(str, font, Screen.ScreenSize.Width);

                if (previousSize != null && (previousSize.Height > textSz.Height || previousSize.Width > textSz.Width))
                {
                    var rect = new WinAPI.RECT();

                    var pointPrev = new PointF(
                        Screen.ScreenSize.Width / 2 - (previousSize.Width / 2),
                        (Screen.ScreenSize.Height / 2) + (Screen.ScreenSize.Height / 4) - (previousSize.Height / 2)
                        );
                    rect.bottom = (int)Math.Ceiling(pointPrev.Y + previousSize.Height);
                    rect.left   = (int)Math.Ceiling(pointPrev.X);
                    rect.right  = (int)Math.Ceiling(pointPrev.X + previousSize.Width);
                    rect.top    = (int)Math.Ceiling(pointPrev.Y);

                    var pRect = Marshal.AllocHGlobal(Marshal.SizeOf(rect)); {
                        Marshal.StructureToPtr(rect, pRect, true);
                        if (!WinAPI.RedrawWindow(hWnd, pRect, IntPtr.Zero, WinAPI.RedrawWindowFlags.Erase | WinAPI.RedrawWindowFlags.Invalidate | WinAPI.RedrawWindowFlags.AllChildren))
                        {
                            Console.Beep(300, 100);
                        }
                    } Marshal.FreeHGlobal(pRect);
                }

                var point = new PointF(
                    Screen.ScreenSize.Width / 2 - (textSz.Width / 2),
                    (Screen.ScreenSize.Height / 2) + (Screen.ScreenSize.Height / 4) - (textSz.Height / 2)
                    );

                BufferedGraphicsContext context = BufferedGraphicsManager.Current;
                BufferedGraphics        buffer  = context.Allocate(gfx, new Rectangle((int)point.X, (int)point.Y, (int)textSz.Width, (int)textSz.Height));
                buffer.Graphics.DrawString(str, font, White, point);

                buffer.Render();

                previousSize = textSz;
            } catch (Exception ex) {
                Debugger.Break();
            }
        }
예제 #8
0
        public static void GetWindowRect(IntPtr hwnd, out Rectangle rectangle)
        {
            WinAPI.DwmIsCompositionEnabled(out IsAero);
            WinAPI.RECT rect = new WinAPI.RECT();

            if (IsAero)
            {
                WinAPI.DwmGetWindowAttribute(hwnd, WinAPI.DWMWINDOWATTRIBUTE.ExtendedFrameBounds, out rect, Marshal.SizeOf(rect));
            }
            else
            {
                WinAPI.GetWindowRect(hwnd, out rect);
            }

            rectangle = new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
        }
예제 #9
0
        private static object CaptureWindow(Argument [] args)
        {
            string windowTitle = (string)args[0].Wykonaj();
            IntPtr hwnd        = WinAPI.FindWindow(null, windowTitle);

            if (hwnd != IntPtr.Zero)
            {
                WinAPI.RECT rect = new WinAPI.RECT();
                WinAPI.GetWindowRect(hwnd, ref rect);
                Rectangle rectangle = rect;
                Size      size      = rectangle.Size;
                try
                {
                    if (!(size.IsEmpty || size.Height < 0 || size.Width < 0))
                    {
                        using (Bitmap bmp = new Bitmap(size.Width, size.Height))
                        {
                            Graphics g  = Graphics.FromImage(bmp);
                            IntPtr   dc = g.GetHdc();

                            WinAPI.PrintWindow(hwnd, dc, 0);

                            g.ReleaseHdc();
                            g.Dispose();
                            string f = null;
                            if (!__imgs.ContainsKey(windowTitle))
                            {
                                __imgs.Add(windowTitle, new Random().Next(0, 99999).ToString() + ".png");
                            }
                            f = __imgs[windowTitle];

                            string filePath = @"F:\DANE_1\programowanie\WWW\HSC_test\" + f;                            // Path.GetFullPath("screen.png");
                            bmp.Save(filePath, ImageFormat.Png);
                            return(f);
                        }
                    }
                }
                catch
                {
                    return("");
                }
            }
            return("");
        }
예제 #10
0
        private void AdjustForm()
        {
            if (!Renderer.Initialized)
            {
                return;
            }


            Form.Invoke((MethodInvoker) delegate
            {
                WinAPI.BringWindowToTop(Form.Handle);
                WinAPI.RECT rect = new WinAPI.RECT();
                WinAPI.POINT pt  = new WinAPI.POINT();

                if (WinAPI.GetClientRect(Process.Process.MainWindowHandle, out rect) &&
                    WinAPI.ClientToScreen(Process.Process.MainWindowHandle, out pt))
                {
                    bool sizeChanged =
                        Form.Width != rect.Right - rect.Left ||
                        Form.Height != rect.Bottom - rect.Top;

                    bool posChanged =
                        Form.Location.X != pt.X ||
                        Form.Location.Y != pt.Y;

                    if (sizeChanged)
                    {
                        Size = new Vector2(rect.Right - rect.Left, rect.Bottom - rect.Top);
                        //BaseContainer.Bounds.Size = Size;
                    }
                    if (posChanged || sizeChanged)
                    {
                        WinAPI.SetWindowPos(Form.Handle,
                                            IntPtr.Zero,
                                            pt.X,
                                            pt.Y,
                                            rect.Right - rect.Left,
                                            rect.Bottom - rect.Top,
                                            0);
                    }
                }
            });
        }
예제 #11
0
파일: MainHub.cs 프로젝트: KyLuaa/bot
        internal MainHub(Objects.Client c)
        {
            if (!WinAPI.IsIconic(c.TibiaProcess.MainWindowHandle))
            {
                this.StartPosition = FormStartPosition.Manual;
                WinAPI.RECT rect = new WinAPI.RECT();
                WinAPI.GetWindowRect(c.TibiaProcess.MainWindowHandle, out rect);
                this.Location = new Point(rect.left + 10, rect.top + 30);
            }
            this.Client = c;
            InitializeComponent();
            this.Icon = Properties.Resources.icon;

            if (!this.Client.HasLoadedProperties)
            {
                ObjectPropertiesLoader loader = new ObjectPropertiesLoader(this.Client);
                loader.ShowDialog();
                if (!loader.Finished) Environment.Exit(Environment.ExitCode);
                loader.Dispose();
            }

            this.timerUpdate.Start();
        }
예제 #12
0
        /// <summary>
        /// 判断所接收到的 wm_nc-calc-size 消息是否指示窗体即将最大化
        /// </summary>
        private bool IsAboutToMaximize(WinAPI.RECT rect)
        {
            /*
             * 判断的方法是,只要窗体的左右、上下都延伸到了屏幕工作区之外,
             * 并且左和右、上和下都延伸相同的量,就认为窗体是要进行最大化
             */

            int left   = rect.Left;
            int top    = rect.Top;
            int width  = rect.Right - rect.Left;
            int height = rect.Bottom - rect.Top;

            if (left < 0 && top < 0)
            {
                Rectangle workingArea = Screen.GetWorkingArea(this);
                if (width == (workingArea.Width + (-left) * 2) &&
                    height == (workingArea.Height + (-top) * 2))
                {
                    return(true);
                }
            }
            return(false);
        }
예제 #13
0
        void UpdateTaskbarThumbnailRect()
        {
            var BrowserRect = new WinAPI.RECT();

            WinAPI.GetWindowRect(this.Handle, out BrowserRect);

            var _rp = new Point();

            _rp.X = BrowserRect.left;
            _rp.Y = BrowserRect.top;
            WinAPI.ScreenToClient(this.FormParent.Handle, out _rp);

            BrowserRect.right  = _rp.X + (BrowserRect.right - BrowserRect.left);
            BrowserRect.bottom = _rp.Y + (BrowserRect.bottom - BrowserRect.top);
            BrowserRect.left   = _rp.X;
            BrowserRect.top    = _rp.Y;

            var    _g = GCHandle.Alloc(BrowserRect, GCHandleType.Pinned);
            IntPtr _p = _g.AddrOfPinnedObject();

            TaskbarList.SetThumbnailClip(this.FormParent.Handle, _p);
            _g.Free();
        }
예제 #14
0
파일: MainForm.cs 프로젝트: rz201/mpv.net
        void SetFormPosAndSize(double scale = 1, bool force = false)
        {
            if (!force)
            {
                if (WindowState == FormWindowState.Maximized)
                {
                    return;
                }

                if (mp.Fullscreen)
                {
                    CycleFullscreen(true);
                    return;
                }
            }

            Screen screen        = Screen.FromControl(this);
            int    autoFitHeight = Convert.ToInt32(screen.WorkingArea.Height * mp.Autofit);

            if (mp.VideoSize.Height == 0 || mp.VideoSize.Width == 0 ||
                mp.VideoSize.Width / (float)mp.VideoSize.Height < App.MinimumAspectRatio)
            {
                mp.VideoSize = new Size((int)(autoFitHeight * (16 / 9.0)), autoFitHeight);
            }

            Size size   = mp.VideoSize;
            int  height = size.Height;

            if (App.RememberHeight || scale != 1)
            {
                if (WasInitialSizeSet || scale != 1)
                {
                    height = ClientSize.Height;
                }
                else
                {
                    height            = autoFitHeight;
                    WasInitialSizeSet = true;
                }
            }

            height = Convert.ToInt32(height * scale);
            int width = Convert.ToInt32(height * size.Width / (double)size.Height);

            if (height > screen.WorkingArea.Height * 0.9)
            {
                height = Convert.ToInt32(screen.WorkingArea.Height * 0.9);
                width  = Convert.ToInt32(height * size.Width / (double)size.Height);
            }

            if (width > screen.WorkingArea.Width * 0.9)
            {
                width  = Convert.ToInt32(screen.WorkingArea.Width * 0.9);
                height = Convert.ToInt32(width * size.Height / (double)size.Width);
            }

            if (height < screen.WorkingArea.Height * mp.AutofitSmaller)
            {
                height = Convert.ToInt32(screen.WorkingArea.Height * mp.AutofitSmaller);
                width  = Convert.ToInt32(height * size.Width / (double)size.Height);
            }

            if (height > screen.WorkingArea.Height * mp.AutofitLarger)
            {
                height = Convert.ToInt32(screen.WorkingArea.Height * mp.AutofitLarger);
                width  = Convert.ToInt32(height * size.Width / (double)size.Height);
            }

            Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
            var   rect      = new WinAPI.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));

            NativeHelp.AddWindowBorders(Handle, ref rect);
            int left = middlePos.X - rect.Width / 2;
            int top  = middlePos.Y - rect.Height / 2;

            Screen[] screens   = Screen.AllScreens;
            int      minLeft   = screens.Select(val => val.WorkingArea.X).Min();
            int      maxRight  = screens.Select(val => val.WorkingArea.Right).Max();
            int      minTop    = screens.Select(val => val.WorkingArea.Y).Min();
            int      maxBottom = screens.Select(val => val.WorkingArea.Bottom).Max();

            if (left < minLeft)
            {
                left = minLeft;
            }

            if (left + rect.Width > maxRight)
            {
                left = maxRight - rect.Width;
            }

            if (top < minTop)
            {
                top = minTop;
            }

            if (top + rect.Height > maxBottom)
            {
                top = maxBottom - rect.Height;
            }

            WinAPI.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
        }
예제 #15
0
        protected override void WndProc(ref Message m)
        {
            //Debug.WriteLine(m);

            switch (m.Msg)
            {
            case 0x201:     // WM_LBUTTONDOWN
            case 0x202:     // WM_LBUTTONUP
            case 0x207:     // WM_MBUTTONDOWN
            case 0x208:     // WM_MBUTTONUP
            case 0x20b:     // WM_XBUTTONDOWN
            case 0x20c:     // WM_XBUTTONUP
            case 0x20A:     // WM_MOUSEWHEEL
            case 0x100:     // WM_KEYDOWN
            case 0x101:     // WM_KEYUP
            case 0x104:     // WM_SYSKEYDOWN
            case 0x105:     // WM_SYSKEYUP
            {
                bool skip = m.Msg == 0x100 && LastAppCommand != 0 &&
                            (Environment.TickCount - LastAppCommand) < 1000;

                if (core.WindowHandle != IntPtr.Zero && !skip)
                {
                    m.Result = WinAPI.SendMessage(core.WindowHandle, m.Msg, m.WParam, m.LParam);
                }
            }
            break;

            case 0x319:     // WM_APPCOMMAND
            {
                string value = mpvHelp.WM_APPCOMMAND_to_mpv_key((int)(m.LParam.ToInt64() >> 16 & ~0xf000));

                if (value != null)
                {
                    core.command("keypress " + value);
                    m.Result       = new IntPtr(1);
                    LastAppCommand = Environment.TickCount;
                    return;
                }
            }
            break;

            case 0x0200:     // WM_MOUSEMOVE
                if (Environment.TickCount - LastCycleFullscreen > 500)
                {
                    Point pos = PointToClient(Cursor.Position);
                    core.command($"mouse {pos.X} {pos.Y}");
                }

                if (CursorHelp.IsPosDifferent(LastCursorPosition))
                {
                    CursorHelp.Show();
                }
                break;

            case 0x2a3:     // WM_MOUSELEAVE
                //osc won't auto hide after mouse left window in borderless mode
                core.command($"mouse {ClientSize.Width / 2} {ClientSize.Height / 3}");
                break;

            case 0x203:     // WM_LBUTTONDBLCLK
            {
                Point pos = PointToClient(Cursor.Position);
                core.command($"mouse {pos.X} {pos.Y} 0 double");
            }
            break;

            case 0x02E0:     // WM_DPICHANGED
            {
                if (!WasShown())
                {
                    break;
                }

                WinAPI.RECT rect = Marshal.PtrToStructure <WinAPI.RECT>(m.LParam);
                WinAPI.SetWindowPos(Handle, IntPtr.Zero, rect.Left, rect.Top, rect.Width, rect.Height, 0);
            }
            break;

            case 0x0214:     // WM_SIZING
            {
                var rc = Marshal.PtrToStructure <WinAPI.RECT>(m.LParam);
                var r  = rc;
                NativeHelp.SubtractWindowBorders(Handle, ref r);
                int  c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
                Size s = core.VideoSize;

                if (s == Size.Empty)
                {
                    s = new Size(16, 9);
                }

                float aspect = s.Width / (float)s.Height;
                int   d_w    = (int)(c_h * aspect - c_w);
                int   d_h    = (int)(c_w / aspect - c_h);

                Debug.WriteLine(d_w);
                Debug.WriteLine(d_h);

                int d_w2 = (int)(c_h * aspect - c_w);
                int d_h2 = (int)(c_w / aspect - c_h);

                Debug.WriteLine(d_w2);
                Debug.WriteLine(d_h2);

                int[] d_corners = { d_w, d_h, -d_w, -d_h };
                int[] corners   = { rc.Left, rc.Top, rc.Right, rc.Bottom };
                int   corner    = NativeHelp.GetResizeBorder(m.WParam.ToInt32());

                if (corner >= 0)
                {
                    corners[corner] -= d_corners[corner];
                }

                Marshal.StructureToPtr <WinAPI.RECT>(new WinAPI.RECT(corners[0], corners[1], corners[2], corners[3]), m.LParam, false);
                m.Result = new IntPtr(1);
            }
                return;

            case 0x004A:     // WM_COPYDATA
            {
                var      copyData = (WinAPI.COPYDATASTRUCT)m.GetLParam(typeof(WinAPI.COPYDATASTRUCT));
                string[] files    = copyData.lpData.Split('\n');
                string   mode     = files[0];
                files = files.Skip(1).ToArray();

                switch (mode)
                {
                case "single":
                    core.LoadFiles(files, true, Control.ModifierKeys.HasFlag(Keys.Control));
                    break;

                case "queue":
                    foreach (string file in files)
                    {
                        core.commandv("loadfile", file, "append");
                    }
                    break;
                }

                Activate();
            }
                return;
            }

            if (m.Msg == TaskbarButtonCreatedMessage && core.TaskbarProgress)
            {
                Taskbar = new Taskbar(Handle);
                ProgressTimer.Start();
            }

            // beep sound when closed using taskbar due to exception
            if (!IsDisposed)
            {
                base.WndProc(ref m);
            }
        }
예제 #16
0
        void SetFormPosAndSize(double scale = 1, bool force = false)
        {
            if (!force)
            {
                if (WindowState != FormWindowState.Normal)
                {
                    return;
                }

                if (core.Fullscreen)
                {
                    CycleFullscreen(true);
                    return;
                }
            }

            Screen screen        = Screen.FromControl(this);
            int    autoFitHeight = Convert.ToInt32(screen.WorkingArea.Height * core.Autofit);

            if (core.VideoSize.Height == 0 || core.VideoSize.Width == 0 ||
                core.VideoSize.Width / (float)core.VideoSize.Height < App.MinimumAspectRatio)
            {
                core.VideoSize = new Size((int)(autoFitHeight * (16 / 9f)), autoFitHeight);
            }

            Size videoSize = core.VideoSize;
            int  height    = videoSize.Height;

            if (core.WasInitialSizeSet || scale != 1)
            {
                height = ClientSize.Height;
            }
            else
            {
                int savedHeight = RegistryHelp.GetInt(App.RegPath, "Height");

                if (App.StartSize == "always" && savedHeight != 0)
                {
                    height = savedHeight;
                }
                else
                if (App.StartSize != "video")
                {
                    height = autoFitHeight;
                }

                core.WasInitialSizeSet = true;
            }

            height = Convert.ToInt32(height * scale);
            int width     = height * videoSize.Width / videoSize.Height;
            int maxHeight = screen.WorkingArea.Height - (Height - ClientSize.Height);
            int maxWidth  = screen.WorkingArea.Width - (Width - ClientSize.Width);

            if (height < maxHeight * core.AutofitSmaller)
            {
                height = Convert.ToInt32(maxHeight * core.AutofitSmaller);
                width  = Convert.ToInt32(height * videoSize.Width / videoSize.Height);
            }

            if (height > maxHeight * core.AutofitLarger)
            {
                height = Convert.ToInt32(maxHeight * core.AutofitLarger);
                width  = Convert.ToInt32(height * videoSize.Width / videoSize.Height);
            }

            if (width > maxWidth)
            {
                width  = maxWidth;
                height = (int)Math.Ceiling(width * videoSize.Height / (double)videoSize.Width);
            }

            Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
            var   rect      = new WinAPI.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));

            NativeHelp.AddWindowBorders(Handle, ref rect);
            int left = middlePos.X - rect.Width / 2;
            int top  = middlePos.Y - rect.Height / 2;

            Screen[] screens   = Screen.AllScreens;
            int      minLeft   = screens.Select(val => val.WorkingArea.X).Min();
            int      maxRight  = screens.Select(val => val.WorkingArea.Right).Max();
            int      minTop    = screens.Select(val => val.WorkingArea.Y).Min();
            int      maxBottom = screens.Select(val => val.WorkingArea.Bottom).Max();

            if (left < minLeft)
            {
                left = minLeft;
            }

            if (left + rect.Width > maxRight)
            {
                left = maxRight - rect.Width;
            }

            if (top < minTop)
            {
                top = minTop;
            }

            if (top + rect.Height > maxBottom)
            {
                top = maxBottom - rect.Height;
            }

            WinAPI.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */,
                                left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
        }
예제 #17
0
파일: CaretPos.cs 프로젝트: AndreWin/Mahou
        /// <summary>
        /// Gets caret position from focused window or from focused control in window.
        /// </summary>
        /// <returns>Point</returns>
        public static Point GetCaretPointToScreen(out Point caretOnlyPos)
        {
            var LuckyNone = new Point(77777, 77777);

            caretOnlyPos = LuckyNone;
            var    _cThr_id  = WinAPI.GetCurrentThreadId();
            var    _pntCR    = new Point(0, 0);
            var    _fwFCS_Re = new WinAPI.RECT(0, 0, 0, 0);
            var    _fw       = WinAPI.GetForegroundWindow();
            uint   dummy     = 0;
            var    _fwThr_id = WinAPI.GetWindowThreadProcessId(_fw, out dummy);
            IntPtr _fwFCS    = IntPtr.Zero;
            var    _clsNMb   = new StringBuilder(256);
            string _clsNMfw  = "";

            Logging.Log("_c HWND: [" + MMain.mahou.Handle + "], _c ThrId: [" + _cThr_id + "], " + "_fw HWND: [" + _fw + "]" + ", _fw ThrId: " + _fwThr_id + ".");
            if (_fwThr_id != _cThr_id)
            {
                var gti = new WinAPI.GUITHREADINFO();
                gti.cbSize = Marshal.SizeOf(gti);
                if (!GetGuiInfo(_fwThr_id, ref gti))
                {
                    return(LuckyNone);
                }
                _fwFCS = gti.hwndFocus;
                WinAPI.GetClassName(_fw, _clsNMb, _clsNMb.Capacity);
                _clsNMfw = _clsNMb.ToString();
                if (_fwFCS != IntPtr.Zero && _fwFCS != _fw)
                {
                    var _fwFCSThr_id = WinAPI.GetWindowThreadProcessId(_fwFCS, out dummy);
                    var gtiFCS       = new WinAPI.GUITHREADINFO();
                    gtiFCS.cbSize = Marshal.SizeOf(gtiFCS);
                    if (!GetGuiInfo(_fwFCSThr_id, ref gtiFCS))
                    {
                        return(LuckyNone);
                    }
                    Logging.Log("_fcs: [" + _fwFCS + "]." + "_fw classname = [" + _clsNMb + "], " + "_fcs thread_id = [" + _fwFCSThr_id + "].");
                    WinAPI.GetClassName(_fwFCS, _clsNMb, _clsNMb.Capacity);
                    Logging.Log("_fcs classname = [" + _clsNMb + "].");
                    WinAPI.GetWindowRect(_fwFCS, out _fwFCS_Re);
                    _pntCR = new Point(gtiFCS.rectCaret.Left, gtiFCS.rectCaret.Top);
                }
                else
                {
                    _pntCR = new Point(gti.rectCaret.Left, gti.rectCaret.Top);
                    WinAPI.GetWindowRect(_fw, out _fwFCS_Re);
                }
                if (_clsNMfw == "PX_WINDOW_CLASS" && MMain.mahou.MCDSSupport)
                {
                    System.Threading.Tasks.Task.Factory.StartNew(GetDataFromMCDS);
                    var CaretToScreen = new Point(_fwFCS_Re.Left, _fwFCS_Re.Top);
                    CaretToScreen.X += _CaretST3.X + SidebarWidth + MMain.mahou.MCDS_Xpos_temp;
                    if (viewID == 4)
                    {
                        WinAPI.RECT clts = new WinAPI.RECT(0, 0, 0, 0);
                        WinAPI.GetWindowRect(WinAPI.GetForegroundWindow(), out clts);
                        CaretToScreen.Y  = clts.Bottom - MMain.mahou.MCDS_BottomIndent_temp - 45 + MMain.mahou.MCDS_Ypos_temp;
                        CaretToScreen.X -= 20;
                    }
                    else
                    {
                        CaretToScreen.Y += _CaretST3.Y + MMain.mahou.MCDS_TopIndent_temp + MMain.mahou.MCDS_Ypos_temp;
                    }
                    caretOnlyPos = _CaretST3;
                    return(CaretToScreen);
                }
                else
                {
                    if (_pntCR.Equals(new Point(0, 0)))
                    {
                        return(LuckyNone);
                    }
                    var _fwTitle = new StringBuilder(128);
                    WinAPI.GetWindowText(_fw, _fwTitle, 127);
                    Logging.Log("CaretPos = x[" + _pntCR.X + "], y[" + _pntCR.Y + "].");
                    // Do not display caret for these classes:
                    var _clsNM = _clsNMb.ToString();
                    if (new Regex("[L][I][S][T][B][O][X]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[B][U][T][T][O][N]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[C][H][E][C][K][B][O][X]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[C][O][M][B][O][B][O][X]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[L][I][S][T][V][I][E][W]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[P][A][G][E][C][O][N][T][r][o][l]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        (new Regex("[W][I][N][D][O][W]", RegexOptions.IgnoreCase).IsMatch(_clsNM) && _clsNM != "MozillaWindowClass") ||
                        new Regex("[S][Y][S][L][I][N][K]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[T][R][E][E]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[H][E][L][P][F][O][R][M]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[T][M][A][I][N][F][O][R][M]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[B][T][N]", RegexOptions.IgnoreCase).IsMatch(_clsNM) || _clsNM.Contains("Afx:") ||
                        _clsNM == "msctls_trackbar32" || _clsNM.Contains("wxWindow") ||
                        _clsNM == "SysTabControl32" || _clsNM == "DirectUIHWND" ||
                        _clsNM == "Static" || _clsNM == "NetUIHWND" || _clsNMfw == "MSPaintApp" ||
                        _clsNM == "PotPlayer" || _clsNM == "MDIClient" ||
                        _clsNMfw == "#32770" && (new Regex("[У][Д][А][Л][И][Т][Ь]", RegexOptions.IgnoreCase).IsMatch(_fwTitle.ToString()) ||
                                                 (new Regex("[D][E][L][E][T][E]", RegexOptions.IgnoreCase).IsMatch(_fwTitle.ToString()))))
                    {
                        return(LuckyNone);
                    }
                    if (_clsNM.Contains("SharpDevelop.exe"))
                    {
                        _pntCR.Y += 28; _pntCR.X += 3;
                    }
                    Logging.Log("Get caret position finished successfully.", 0);
                    caretOnlyPos = _pntCR;
                    return(new Point(_fwFCS_Re.Left + _pntCR.X, _fwFCS_Re.Top + _pntCR.Y));
                }
            }
            return(LuckyNone);
        }
예제 #18
0
파일: MainHub.cs 프로젝트: KyLuaa/bot
 private void trayIcon_DoubleClick(object sender, EventArgs e)
 {
     if (!WinAPI.IsIconic(this.Client.TibiaProcess.MainWindowHandle))
     {
         this.StartPosition = FormStartPosition.Manual;
         WinAPI.RECT rect = new WinAPI.RECT();
         WinAPI.GetWindowRect(this.Client.TibiaProcess.MainWindowHandle, out rect);
         this.Location = new Point(rect.left + 10, rect.top + 30);
     }
     this.Show();
     trayIcon.Visible = false;
 }
예제 #19
0
        /// <summary>
        /// Gets caret position from focused window or from focused control in window.
        /// </summary>
        /// <returns>Point</returns>
        public static Point GetCaretPointToScreen(out Point caretOnlyPos)
        {
            var LuckyNone = new Point(77777, 77777);

            caretOnlyPos = LuckyNone;
            var    _cThr_id  = WinAPI.GetCurrentThreadId();
            var    _pntCR    = new Point(0, 0);
            var    _fwFCS_Re = new WinAPI.RECT(0, 0, 0, 0);
            var    _fw       = WinAPI.GetForegroundWindow();
            uint   dummy     = 0;
            var    _fwThr_id = WinAPI.GetWindowThreadProcessId(_fw, out dummy);
            IntPtr _fwFCS    = IntPtr.Zero;
            var    _clsNMb   = new StringBuilder(256);
            string _clsNMfw  = "";

            Logging.Log("_c HWND: [" + MMain.MAHOU_HANDLE + "], _c ThrId: [" + _cThr_id +
                        "], " + "_fw HWND: [" + _fw + "]" + ", _fw ThrId: " + _fwThr_id + ".");
            if (_fwThr_id != _cThr_id)
            {
                var gti = new WinAPI.GUITHREADINFO();
                gti.cbSize = Marshal.SizeOf(gti);
                if (!GetGuiInfo(_fwThr_id, ref gti))
                {
                    return(LuckyNone);
                }
                _fwFCS = gti.hwndFocus;
                WinAPI.GetClassName(_fw, _clsNMb, _clsNMb.Capacity);
                _clsNMfw = _clsNMb.ToString();
                if (_fwFCS != IntPtr.Zero && _fwFCS != _fw)
                {
                    var _fwFCSThr_id = WinAPI.GetWindowThreadProcessId(_fwFCS, out dummy);
                    var gtiFCS       = new WinAPI.GUITHREADINFO();
                    gtiFCS.cbSize = Marshal.SizeOf(gtiFCS);
                    if (!GetGuiInfo(_fwFCSThr_id, ref gtiFCS))
                    {
                        return(LuckyNone);
                    }
                    Logging.Log("_fcs: [" + _fwFCS + "]." + "_fw classname = [" + _clsNMb + "], " + "_fcs thread_id = [" + _fwFCSThr_id + "].");
                    WinAPI.GetClassName(_fwFCS, _clsNMb, _clsNMb.Capacity);
                    Logging.Log("_fcs classname = [" + _clsNMb + "].");
                    WinAPI.GetWindowRect(_fwFCS, out _fwFCS_Re);
                    _pntCR = new Point(gtiFCS.rectCaret.Left, gtiFCS.rectCaret.Top);
                }
                else
                {
                    _pntCR = new Point(gti.rectCaret.Left, gti.rectCaret.Top);
                    WinAPI.GetWindowRect(_fw, out _fwFCS_Re);
                }
                if (_clsNMfw == "PX_WINDOW_CLASS" && MMain.mahou.MCDSSupport)
                {
                    System.Threading.Tasks.Task.Factory.StartNew(GetDataFromMCDS);
                    var CaretToScreen = new Point(_fwFCS_Re.Left, _fwFCS_Re.Top);
                    CaretToScreen.X += _CaretST3.X + SidebarWidth + MMain.mahou.MCDS_Xpos_temp;
                    if (viewID == 4)
                    {
                        WinAPI.RECT clts = new WinAPI.RECT(0, 0, 0, 0);
                        WinAPI.GetWindowRect(WinAPI.GetForegroundWindow(), out clts);
                        CaretToScreen.Y  = clts.Bottom - MMain.mahou.MCDS_BottomIndent_temp - 45 + MMain.mahou.MCDS_Ypos_temp;
                        CaretToScreen.X -= 20;
                    }
                    else
                    {
                        CaretToScreen.Y += _CaretST3.Y + MMain.mahou.MCDS_TopIndent_temp + MMain.mahou.MCDS_Ypos_temp;
                    }
                    caretOnlyPos = _CaretST3;
                    return(CaretToScreen);
                }
                else
                {
                    if (_pntCR.Equals(new Point(0, 0)))
                    {
                        return(LuckyNone);
                    }
                    Logging.Log("CaretPos = x[" + _pntCR.X + "], y[" + _pntCR.Y + "].");
                    var _clsNM = _clsNMb.ToString().ToLower();
                    // Do not display caret for these classes:
                    if (_clsNM.Contains("listbox") || _clsNM.Contains("button") ||
                        _clsNM.Contains("checkbox") || _clsNM.Contains("combobox") ||
                        _clsNM.Contains("listview") || _clsNM.Contains("pagecontrol") ||
                        (_clsNM.Contains("window") && !_clsNM.Contains("mozilla")) || _clsNM.Contains("syslink") ||
                        _clsNM.Contains("tree") || _clsNM.Contains("helpform") ||
                        _clsNM.Contains("tmainform") || _clsNM.Contains("btn") ||
                        _clsNM.Contains("удалить") || _clsNM.Contains("delete") ||
                        _clsNM.Contains("afx:") ||
                        _clsNM == "msctls_trackbar32" || _clsNM.Contains("wxwindow") ||
                        _clsNM == "systabcontrol32" || _clsNM == "directuihwnd" ||
                        _clsNM == "static" || _clsNM == "netuihwnd" || _clsNMfw == "mspaintapp" ||
                        _clsNM == "potplayer" || _clsNM == "mdiclient" ||
                        (_clsNMfw == "#32770" && _clsNM != "edit"))
                    {
                        return(LuckyNone);
                    }
                    if (_clsNM.Contains("sharpdevelop.exe"))
                    {
                        _pntCR.Y += 28; _pntCR.X += 3;
                    }
                    Logging.Log("Get caret position finished successfully.", 0);
                    caretOnlyPos = _pntCR;
                    return(new Point(_fwFCS_Re.Left + _pntCR.X, _fwFCS_Re.Top + _pntCR.Y));
                }
            }
            return(LuckyNone);
        }
 private static extern IntPtr GetWindowRect(IntPtr hWnd, out WinAPI.RECT rect);
예제 #21
0
파일: MainForm.cs 프로젝트: rz201/mpv.net
        protected override void WndProc(ref Message m)
        {
            //Debug.WriteLine(m);

            switch (m.Msg)
            {
            case 0x0201:     // WM_LBUTTONDOWN
            case 0x0202:     // WM_LBUTTONUP
            case 0x0207:     // WM_MBUTTONDOWN
            case 0x0208:     // WM_MBUTTONUP
            case 0x020b:     // WM_XBUTTONDOWN
            case 0x020c:     // WM_XBUTTONUP
            case 0x020A:     // WM_MOUSEWHEEL
            case 0x0100:     // WM_KEYDOWN
            case 0x0101:     // WM_KEYUP
            case 0x0104:     // WM_SYSKEYDOWN
            case 0x0105:     // WM_SYSKEYUP
            case 0x319:      // WM_APPCOMMAND
                if (mp.WindowHandle != IntPtr.Zero)
                {
                    WinAPI.SendMessage(mp.WindowHandle, m.Msg, m.WParam, m.LParam);
                }
                break;

            case 0x0200:     // WM_MOUSEMOVE
            {
                if ((DateTime.Now - LastCycleFullscreen).TotalMilliseconds > 500)
                {
                    Point pos = PointToClient(Cursor.Position);
                    mp.command($"mouse {pos.X} {pos.Y}");
                }

                if (CursorHelp.IsPosDifferent(LastCursorPosChanged))
                {
                    CursorHelp.Show();
                }
            }
            break;

            case 0x2a3:     // WM_MOUSELEAVE
                // osc won't always auto hide
                mp.command("mouse 1 1");
                break;

            case 0x203:     // WM_LBUTTONDBLCLK
            {
                Point pos = PointToClient(Cursor.Position);
                mp.command($"mouse {pos.X} {pos.Y} 0 double");
            }
            break;

            case 0x02E0:     // WM_DPICHANGED
            {
                if (!WasShown)
                {
                    break;
                }

                WinAPI.RECT rect = Marshal.PtrToStructure <WinAPI.RECT>(m.LParam);
                WinAPI.SetWindowPos(Handle, IntPtr.Zero, rect.Left, rect.Top, rect.Width, rect.Height, 0);
            }
            break;

            case 0x0214:     // WM_SIZING
            {
                var rc = Marshal.PtrToStructure <WinAPI.RECT>(m.LParam);
                var r  = rc;
                NativeHelp.SubtractWindowBorders(Handle, ref r);
                int  c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
                Size s = mp.VideoSize;

                if (s == Size.Empty)
                {
                    s = new Size(16, 9);
                }

                float aspect    = s.Width / (float)s.Height;
                int   d_w       = Convert.ToInt32(c_h * aspect - c_w);
                int   d_h       = Convert.ToInt32(c_w / aspect - c_h);
                int[] d_corners = { d_w, d_h, -d_w, -d_h };
                int[] corners   = { rc.Left, rc.Top, rc.Right, rc.Bottom };
                int   corner    = NativeHelp.GetResizeBorder(m.WParam.ToInt32());

                if (corner >= 0)
                {
                    corners[corner] -= d_corners[corner];
                }

                Marshal.StructureToPtr <WinAPI.RECT>(new WinAPI.RECT(corners[0], corners[1], corners[2], corners[3]), m.LParam, false);
                m.Result = new IntPtr(1);
            }
                return;

            case 0x004A:     // WM_COPYDATA
            {
                var      copyData = (WinAPI.COPYDATASTRUCT)m.GetLParam(typeof(WinAPI.COPYDATASTRUCT));
                string[] files    = copyData.lpData.Split('\n');
                string   mode     = files[0];
                files = files.Skip(1).ToArray();

                switch (mode)
                {
                case "single":
                    mp.Load(files, true, Control.ModifierKeys.HasFlag(Keys.Control));
                    break;

                case "queue":
                    foreach (string file in files)
                    {
                        mp.commandv("loadfile", file, "append");
                    }
                    break;
                }

                Activate();
            }
                return;
            }

            if (m.Msg == TaskbarButtonCreatedMessage && mp.TaskbarProgress)
            {
                Taskbar = new Taskbar(Handle);
                ProgressTimer.Start();
            }

            base.WndProc(ref m);
        }
예제 #22
0
 public static extern bool GetWindowRect(IntPtr hWnd, out WinAPI.RECT lpRect);
예제 #23
0
 public static void AddWindowBorders(IntPtr hwnd, ref WinAPI.RECT rc)
 {
     WinAPI.AdjustWindowRect(ref rc, (uint)WinAPI.GetWindowLong(hwnd, -16 /* GWL_STYLE */), false);
 }