Files
GeekDesk/Util/ScreenUtil.cs
2022-08-30 09:06:27 +08:00

157 lines
5.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
namespace GeekDesk.Util
{
public class ScreenUtil
{
[DllImport("user32.dll")]
static extern bool GetCursorPos(ref System.Drawing.Point lpPoint);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
//取得前台窗口句柄函数
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
//取得桌面窗口句柄函数
[DllImport("user32.dll")]
private static extern IntPtr GetDesktopWindow();
//取得Shell窗口句柄函数
[DllImport("user32.dll")]
private static extern IntPtr GetShellWindow();
//取得窗口大小函数
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
//获取窗口标题
[DllImport("user32", SetLastError = true)]
private static extern int GetWindowText(
IntPtr hWnd,//窗口句柄
StringBuilder lpString,//标题
int nMaxCount //最大值
);
//获取类的名字
[DllImport("user32.dll")]
private static extern int GetClassName(
IntPtr hWnd,//句柄
StringBuilder lpString, //类名
int nMaxCount); //最大值
/// <summary>
/// 判断当前屏幕(鼠标最后活动屏幕)是否有全屏化应用
/// </summary>
/// <returns></returns>
public static bool IsPrimaryFullScreen()
{
//桌面窗口句柄
IntPtr desktopHandle; //Window handle for the desktop
//Shell窗口句柄
IntPtr shellHandle; //Window handle for the shell 因为桌面窗口和Shell窗口也是全屏要排除在其他全屏程序之外。 //取得桌面和Shell窗口句柄
desktopHandle = GetDesktopWindow();
shellHandle = GetShellWindow(); //取得前台窗口句柄并判断是否全屏
bool runningFullScreen = false;
RECT appBounds;
Rectangle screenBounds;
IntPtr hWnd;
//取得前台窗口
hWnd = GetForegroundWindow();
StringBuilder sb = new StringBuilder(256);
try
{
GetClassName(hWnd, sb, sb.Capacity);
}
catch { }
if (sb.ToString().ToLower().Equals("workerw")) return false;
if (hWnd != null && !hWnd.Equals(IntPtr.Zero))
{
//判断是否桌面或shell
if (!(hWnd.Equals(desktopHandle) || hWnd.Equals(shellHandle)))
{
//取得窗口大小
GetWindowRect(hWnd, out appBounds);
//判断是否全屏
screenBounds = Screen.FromHandle(hWnd).Bounds;
if ((appBounds.bottom - appBounds.top) == screenBounds.Height
&& (appBounds.right - appBounds.left) == screenBounds.Width)
runningFullScreen = true;
}
}
return runningFullScreen;
}
public static Color GetColorAt(System.Drawing.Point location)
{
Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
using (Graphics gdest = Graphics.FromImage(screenPixel))
{
using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
{
IntPtr hSrcDC = gsrc.GetHdc();
IntPtr hDC = gdest.GetHdc();
int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy);
gdest.ReleaseHdc();
gsrc.ReleaseHdc();
}
}
return screenPixel.GetPixel(0, 0);
}
[DllImport("gdi32")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
public const int HORZRES = 8;
public const int VERTRES = 10;
public const int DESKTOPVERTRES = 117;
public const int DESKTOPHORZRES = 118;
/// <summary>
/// 获取屏幕缩放比例
/// </summary>
/// <returns></returns>
public static double GetScreenScalingFactor()
{
try
{
var g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
var physicalScreenHeight = GetDeviceCaps(desktop, (int)DESKTOPVERTRES);
var screenScalingFactor =
(double)physicalScreenHeight / SystemParameters.PrimaryScreenHeight;
//SystemParameters.PrimaryScreenHeight;
return screenScalingFactor;
} catch (Exception e)
{
return 1;
}
}
}
}