Magpie/CursorHook/NativeMethods.cs
2021-03-20 22:11:03 +08:00

175 lines
6.2 KiB
C#

using System;
using System.Runtime.InteropServices;
namespace Magpie.CursorHook {
// Win32 API
static class NativeMethods {
[DllImport("user32.dll")]
public static extern IntPtr SetCursor(IntPtr hCursor);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
public readonly static IntPtr IDC_ARROW = new IntPtr(32512);
public readonly static IntPtr IDC_HAND = new IntPtr(32649);
public readonly static IntPtr IDC_APPSTARTING = new IntPtr(32650);
public const int GCLP_HCURSOR = -12;
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern long GetClassLongPtr(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int GetClassLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern long SetClassLongPtr(IntPtr hWnd, int nIndex, long dwNewLong);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int SetClassLong(IntPtr hWnd, int nIndex, int dwNewLong);
public static long GetClassAuto(IntPtr hWnd, int nIndex) {
// 尽管文档表示 GetClassLongPtr 可以在 32 位程序里使用,但实际上会失败
if (EasyHook.NativeAPI.Is64Bit) {
return GetClassLongPtr(hWnd, nIndex);
} else {
return GetClassLong(hWnd, nIndex);
}
}
public static long SetClassAuto(IntPtr hWnd, int nIndex, long dwNew) {
if (EasyHook.NativeAPI.Is64Bit) {
return SetClassLongPtr(hWnd, nIndex, dwNew);
} else {
return SetClassLong(hWnd, nIndex, (int)dwNew);
}
}
public delegate bool EnumWindowsProc(IntPtr hwnd, int lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public const uint WM_SETCURSOR = 0x0020;
public const int HTCLIENT = 1;
[StructLayout(LayoutKind.Sequential)]
public struct POINT {
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public struct CURSORINFO {
public int cbSize;
public int flags;
public IntPtr hCursor;
public POINT ptScreenPos;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorInfo(ref CURSORINFO pci);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DestroyCursor(IntPtr hCursor);
[StructLayout(LayoutKind.Sequential)]
public struct ICONINFO {
public int fIcon;
public uint xHotspot;
public uint yHotspot;
public IntPtr hbmMask;
public IntPtr hbmColor;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);
[DllImport("user32.dll")]
public static extern IntPtr CopyIcon(IntPtr hIcon);
[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteObject(IntPtr ho);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern uint RegisterWindowMessage([MarshalAs(UnmanagedType.LPWStr)]string lpString);
private const int SM_CXCURSOR = 13;
private const int SM_CYCURSOR = 14;
[DllImport("user32.dll")]
private static extern int GetSystemMetrics(int nIndex);
public static (int x, int y) GetCursorSize() {
return (GetSystemMetrics(SM_CXCURSOR), GetSystemMetrics(SM_CYCURSOR));
}
[DllImport("user32.dll")]
public static extern SafeCursorHandle CreateCursor(IntPtr hInst, int xHotSpot, int yHotSpot, int nWidth, int nHeight, byte[] pvANDPlane, byte[] pvXORPlane);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr GetModuleHandle(IntPtr lpModuleName);
public static IntPtr GetModule() {
return GetModuleHandle(IntPtr.Zero);
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId);
[DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);
public static int GetWindowProcessId(IntPtr hWnd) {
if(hWnd == IntPtr.Zero) {
return 0;
}
int processId = 0;
if(GetWindowThreadProcessId(hWnd, ref processId) == 0) {
return 0;
}
return processId;
}
public static int GetWindowThreadId(IntPtr hWnd) {
if (hWnd == IntPtr.Zero) {
return 0;
}
return GetWindowThreadProcessId(hWnd, IntPtr.Zero);
}
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(
[MarshalAs(UnmanagedType.LPWStr)] string lpClassName,
IntPtr lpWindowName
);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
}
}