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); //最大值
///
/// 判断当前屏幕(鼠标最后活动屏幕)是否有全屏化应用
///
///
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;
///
/// 获取屏幕缩放比例
///
///
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;
}
}
}
}