old_flsystem/类库/Api.Framework/MB/MB_Common.cs

454 lines
14 KiB
C#

using System;
using System.Text;
using System.Runtime.InteropServices;
namespace MB
{
public delegate IntPtr WndProcCallback(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
public RECT(int left, int top, int right, int bottom)
{
Left = left;
Top = top;
Right = right;
Bottom = bottom;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct SIZE
{
public int cx;
public int cy;
public SIZE(int x, int y)
{
cx = x;
cy = y;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct PAINTSTRUCT
{
public int hdc;
public int fErase;
public RECT rcPaint;
public int fRestore;
public int fIncUpdate;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] rgbReserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public struct COMPOSITIONFORM
{
public int dwStyle;
public POINT ptCurrentPos;
public RECT rcArea;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAP
{
public int bmType;
public int bmWidth;
public int bmHeight;
public int bmWidthBytes;
public short bmPlanes;
public short bmBitsPixel;
public int bmBits;
}
[StructLayout(LayoutKind.Explicit, Size = 4)]
public struct BLENDFUNCTION
{
[FieldOffset(0)]
public byte BlendOp;
[FieldOffset(1)]
public byte BlendFlags;
[FieldOffset(2)]
public byte SourceConstantAlpha;
[FieldOffset(3)]
public byte AlphaFormat;
}
public enum WinConst : int
{
GWL_EXSTYLE = -20,
GWL_WNDPROC = -4,
WS_EX_LAYERED = 524288,
WM_PAINT = 15,
WM_ERASEBKGND = 20,
WM_SIZE = 5,
WM_KEYDOWN = 256,
WM_KEYUP = 257,
WM_CHAR = 258,
WM_LBUTTONDOWN = 513,
WM_LBUTTONUP = 514,
WM_MBUTTONDOWN = 519,
WM_RBUTTONDOWN = 516,
WM_LBUTTONDBLCLK = 515,
WM_MBUTTONDBLCLK = 521,
WM_RBUTTONDBLCLK = 518,
WM_MBUTTONUP = 520,
WM_RBUTTONUP = 517,
WM_MOUSEMOVE = 512,
WM_CONTEXTMENU = 123,
WM_MOUSEWHEEL = 522,
WM_SETFOCUS = 7,
WM_KILLFOCUS = 8,
WM_IME_STARTCOMPOSITION = 269,
WM_NCHITTEST = 132,
WM_GETMINMAXINFO = 36,
WM_DESTROY = 2,
WM_SETCURSOR = 32,
MK_CONTROL = 8,
MK_SHIFT = 4,
MK_LBUTTON = 1,
MK_MBUTTON = 16,
MK_RBUTTON = 2,
KF_REPEAT = 16384,
KF_EXTENDED = 256,
SRCCOPY = 13369376,
CAPTUREBLT = 1073741824,
CFS_POINT = 2,
CFS_FORCE_POSITION = 32,
OBJ_BITMAP = 7,
AC_SRC_OVER = 0,
AC_SRC_ALPHA = 1,
ULW_ALPHA = 2,
WM_INPUTLANGCHANGE = 81,
WM_NCDESTROY = 130,
WM_SYSCOMMAND = 274,
CS_DROPSHADOW = 0x00020000,
}
public static class MB_Common
{
[DllImport("user32.dll", EntryPoint = "GetWindowLongW")]
public static extern int GetWindowLong32(IntPtr hwnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
public static extern int GetWindowLong64(IntPtr hwnd, int nIndex);
public static int GetWindowLong(IntPtr hwnd, int nIndex)
{
return IntPtr.Size == 8 ? GetWindowLong64(hwnd, nIndex) : GetWindowLong32(hwnd, nIndex);
}
[DllImport("user32.dll", EntryPoint = "SetWindowLongW")]
public static extern int SetWindowLong32(IntPtr hwnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
public static extern int SetWindowLong64(IntPtr hwnd, int nIndex, int dwNewLong);
public static int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong)
{
return IntPtr.Size == 8 ? SetWindowLong64(hwnd, nIndex, dwNewLong) : SetWindowLong32(hwnd, nIndex, dwNewLong);
}
[DllImport("user32.dll", EntryPoint = "CallWindowProcW")]
public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", EntryPoint = "DefWindowProcA")]
public static extern IntPtr DefWindowProc(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", EntryPoint = "GetClientRect")]
public static extern int GetClientRect(IntPtr hwnd, ref RECT lpRect);
[DllImport("user32.dll", EntryPoint = "BeginPaint")]
public static extern IntPtr BeginPaint(IntPtr hwnd, ref PAINTSTRUCT lpPaint);
[DllImport("user32.dll", EntryPoint = "IntersectRect")]
public static extern int IntersectRect(ref RECT lpDestRect, ref RECT lpSrc1Rect, ref RECT lpSrc2Rect);
[DllImport("gdi32.dll", EntryPoint = "BitBlt")]
public static extern int BitBlt(IntPtr hDestDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
[DllImport("user32.dll", EntryPoint = "EndPaint")]
public static extern int EndPaint(IntPtr hwnd, ref PAINTSTRUCT lpPaint);
[DllImport("user32.dll", EntryPoint = "GetFocus")]
public static extern IntPtr GetFocus();
[DllImport("user32.dll", EntryPoint = "SetFocus")]
public static extern IntPtr SetFocus(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint = "SetCapture")]
public static extern int SetCapture(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint = "ReleaseCapture")]
public static extern int ReleaseCapture();
[DllImport("user32.dll", EntryPoint = "ScreenToClient")]
public static extern int ScreenToClient(IntPtr hwnd, ref POINT lpPoint);
[DllImport("imm32.dll", EntryPoint = "ImmGetContext")]
public static extern IntPtr ImmGetContext(IntPtr hwnd);
[DllImport("imm32.dll", EntryPoint = "ImmSetCompositionWindow")]
public static extern int ImmSetCompositionWindow(IntPtr himc, ref COMPOSITIONFORM lpCompositionForm);
[DllImport("imm32.dll", EntryPoint = "ImmReleaseContext")]
public static extern int ImmReleaseContext(IntPtr hwnd, IntPtr himc);
[DllImport("user32.dll", EntryPoint = "GetWindowRect")]
public static extern int GetWindowRect(IntPtr hwnd, ref RECT lpRect);
[DllImport("user32.dll", EntryPoint = "OffsetRect")]
public static extern int OffsetRect(ref RECT lpRect, int x, int y);
[DllImport("gdi32.dll", EntryPoint = "GetCurrentObject")]
public static extern IntPtr GetCurrentObject(IntPtr hdc, int uObjectType);
[DllImport("gdi32.dll", EntryPoint = "GetObjectW")]
public static extern int GetObject(IntPtr hObject, int nCount, ref BITMAP lpObject);
[DllImport("user32.dll", EntryPoint = "GetDC")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint = "UpdateLayeredWindow")]
public static extern int UpdateLayeredWindow(IntPtr hWnd, IntPtr hdcDst, IntPtr pptDst, ref SIZE psize, IntPtr hdcSrc, ref POINT pptSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags);
[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleBitmap")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);
[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
public static extern int DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll", EntryPoint = "DeleteDC")]
public static extern int DeleteDC(IntPtr hdc);
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
public static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
[DllImport("user32.dll", EntryPoint = "InvalidateRect")]
public static extern int InvalidateRect(IntPtr hwnd, ref RECT lpRect, bool bErase);
[DllImport("kernel32.dll", EntryPoint = "lstrlenA")]
public static extern int lstrlen(IntPtr lpString);
[DllImport("kernel32.dll", EntryPoint = "lstrlenA")]
public static extern int lstrlenA(IntPtr lpString);
[DllImport("kernel32.dll", EntryPoint = "lstrlenW")]
public static extern int lstrlenW(IntPtr lpString);
[DllImport("user32.dll ", EntryPoint = "SendMessage")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
public static ulong LOWORD(this IntPtr dword)
{
return IntPtr.Size == 4 ? (ulong)dword & 65535 : (ulong)dword & 4294967295;
}
public static ulong HIWORD(this IntPtr dword)
{
return IntPtr.Size == 4 ? (ulong)dword >> 16 : (ulong)dword >> 32;
}
public static int LOWORD(this int dword)
{
return dword & 65535;
}
public static int HIWORD(this int dword)
{
return dword >> 16;
}
public static int To32(this IntPtr dword)
{
return IntPtr.Size == 8 ? (int)(dword.ToInt64() << 32 >> 32) : dword.ToInt32();
}
public static string UTF8PtrToStr(this IntPtr utf8)
{
if (utf8 == IntPtr.Zero)
{
return string.Empty;
}
int iLen = lstrlenA(utf8);
byte[] bytes = new byte[iLen];
Marshal.Copy(utf8, bytes, 0, iLen);
return Encoding.UTF8.GetString(bytes);
}
public static IntPtr StrToUtf8Ptr(this string str)
{
IntPtr ptr = IntPtr.Zero;
if (str != null)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
ptr = Marshal.AllocHGlobal(bytes.Length + 1);
Marshal.Copy(bytes, 0, ptr, bytes.Length);
Marshal.WriteByte(ptr, bytes.Length, 0);
}
return ptr;
}
public static string UnicodePtrToStr(this IntPtr unicode)
{
/*if (unicode == IntPtr.Zero)
{
return string.Empty;
}
int iLen = lstrlenW(unicode);
char[] ch = new char[iLen];
Marshal.Copy(unicode, ch, 0, iLen);
return new string(ch);*/
return Marshal.PtrToStringUni(unicode);
}
public static IntPtr StrToUnicodePtr(this string str)
{
IntPtr ptr = IntPtr.Zero;
if (str != null)
{
byte[] bytes = Encoding.Unicode.GetBytes(str);
ptr = Marshal.AllocHGlobal(bytes.Length + 1);
Marshal.Copy(bytes, 0, ptr, bytes.Length);
Marshal.WriteByte(ptr, bytes.Length, 0);
}
return ptr;
}
public static byte[] StructToBytes(this object structObj)
{
int iSize = Marshal.SizeOf(structObj);
byte[] bytes = new byte[iSize];
IntPtr structPtr = Marshal.AllocHGlobal(iSize);
Marshal.StructureToPtr(structObj, structPtr, false);
Marshal.Copy(structPtr, bytes, 0, iSize);
Marshal.FreeHGlobal(structPtr);
return bytes;
}
public static object BytesToStuct(this byte[] bytes, Type type)
{
object objRet = null;
int iSize = Marshal.SizeOf(type);
if (iSize <= bytes.Length)
{
IntPtr structPtr = Marshal.AllocHGlobal(iSize);
Marshal.Copy(bytes, 0, structPtr, iSize);
objRet = Marshal.PtrToStructure(structPtr, type);
Marshal.FreeHGlobal(structPtr);
}
return objRet;
}
public static IntPtr StructToUTF8Ptr(this object structObj)
{
int iSize = Marshal.SizeOf(structObj);
byte[] bytes = new byte[iSize];
IntPtr structPtr = Marshal.AllocHGlobal(iSize);
Marshal.StructureToPtr(structObj, structPtr, false);
Marshal.Copy(structPtr, bytes, 0, iSize);
return structPtr;
}
public static object UTF8PtrToStruct(this IntPtr structPtr, Type type)
{
return Marshal.PtrToStructure(structPtr, type);
}
public static byte[] UTF8PtrToByte(this IntPtr utf8)
{
if (utf8 == IntPtr.Zero)
{
return new byte[0];
}
int iLen = lstrlenA(utf8);
byte[] bytes = new byte[iLen];
Marshal.Copy(utf8, bytes, 0, iLen);
return bytes;
}
public static IntPtr ByteToUtf8Ptr(this byte[] data)
{
IntPtr ptr = IntPtr.Zero;
if (data != null)
{
ptr = Marshal.AllocHGlobal(data.Length + 1);
Marshal.Copy(data, 0, ptr, data.Length);
Marshal.WriteByte(ptr, data.Length, 0);
}
return ptr;
}
public static string[] PtrToStringArray(this IntPtr ptr, int iLength)
{
string[] data = new string[iLength];
for (int i = 0; i < iLength; i++)
{
IntPtr str = (IntPtr)Marshal.PtrToStructure(ptr, typeof(IntPtr));
data[i] = Marshal.PtrToStringAnsi(str);
ptr = new IntPtr(ptr.ToInt64() + IntPtr.Size);
}
return data;
}
public static long ToLong(this DateTime time)
{
DateTime now = time.ToUniversalTime();
DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (now.Ticks - start.Ticks) / 10000;
}
public static DateTime ToDT(this long time)
{
DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
time = start.Ticks + time * 10000;
return new DateTime(time, DateTimeKind.Utc).ToLocalTime();
}
}
}