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)" }); }
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(); }
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; }
//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); } }
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; }
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(); } }
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); }
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(""); }
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); } } }); }
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(); }
/// <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); }
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(); }
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 */); }
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); } }
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 */); }
/// <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); }
/// <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);
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); }
public static extern bool GetWindowRect(IntPtr hWnd, out WinAPI.RECT lpRect);
public static void AddWindowBorders(IntPtr hwnd, ref WinAPI.RECT rc) { WinAPI.AdjustWindowRect(ref rc, (uint)WinAPI.GetWindowLong(hwnd, -16 /* GWL_STYLE */), false); }