using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using KeePassLib.Native;
using Microsoft.Win32;
namespace AutoTypeSearch
{
internal static class NativeMethods
{
private const int EM_SETMARGINS = 0x00D3;
private const int EC_RIGHTMARGIN = 0x2;
private const int WM_NCLBUTTONDOWN = 0xA1;
private const int HTCAPTION = 0x2;
[DllImport("User32.dll")]
private static extern bool ReleaseCapture();
[DllImport("User32.dll")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOMOVE = 0x0002;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_FRAMECHANGED = 0x0020;
[DllImport("user32.dll", SetLastError=true)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
private const int WM_NCCALCSIZE = 0x83;
private struct RECT
{
public int Left, Top, Right, Bottom;
}
private struct WINDOWPOS
{
public IntPtr hwnd;
public IntPtr hwndinsertafter;
public int x, y, cx, cy;
public int flags;
}
struct NCCALCSIZE_PARAMS
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public RECT[] rgrc;
public WINDOWPOS lppos;
}
public static void SetTextBoxRightMargin(TextBox control, int rightMargin)
{
SendMessage(control.Handle, EM_SETMARGINS, EC_RIGHTMARGIN, rightMargin << 16);
}
public static void StartFormDrag(Form form)
{
Debug.Assert(Control.MouseButtons == MouseButtons.Left);
ReleaseCapture();
SendMessage(form.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
public static void RefreshWindowFrame(IntPtr hWnd)
{
NativeMethods.SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}
public static void RemoveWindowFrameTopBorder(ref Message m, int borderHeight)
{
if (m.Msg == WM_NCCALCSIZE)
{
var csp = (NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(NCCALCSIZE_PARAMS));
csp.rgrc[0].Top -= borderHeight;
Marshal.StructureToPtr(csp, m.LParam, false);
}
}
public static bool IsWindows10()
{
return NativeLib.GetPlatformID() == PlatformID.Win32NT &&
// Can't just use OS Version because Windows 10 lies if you don't have specific support declared in the manifest.
(int)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMajorVersionNumber", -1) == 10;
}
}
}