1. 程式人生 > 其它 >unity_使用windows框體實現自由縮放拖拽功能_筆記

unity_使用windows框體實現自由縮放拖拽功能_筆記

實現常見windows程式 自由拖拽縮放框體大小功能。

主要體現常見且習慣性操作體驗。

build setting :

另 附上一段程式碼 有關win32的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;


public class WIN32API
{

    [DllImport(
"User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)] public static extern int MessageBox(IntPtr handle, String message, String title, int type); #region WIN32API delegate bool EnumWindowsCallBack(IntPtr hwnd, IntPtr lParam); [DllImport("user32", CharSet = CharSet.Unicode)]
static extern bool SetWindowTextW(IntPtr hwnd, string title); [DllImport("user32")] static extern int EnumWindows(EnumWindowsCallBack lpEnumFunc, IntPtr lParam); [DllImport("user32")] static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref IntPtr lpdwProcessId); #endregion public
IntPtr myWindowHandle { get; private set; } public void Start() { UnityEngine.Screen.SetResolution(UnityEngine.Screen.width, UnityEngine.Screen.height, false); IntPtr handle = (IntPtr)System.Diagnostics.Process.GetCurrentProcess().Id; //獲取程序ID EnumWindows(new EnumWindowsCallBack(EnumWindCallback), handle); //列舉查詢本視窗 } /// <summary> /// $"程式名 {Application.version} {Application.unityVersion} {GameApp.Ins.appConfig.buildtime}" /// </summary> /// <param name="title"></param> public void SetAppTitle(string title) { if (null != myWindowHandle) { SetWindowTextW(myWindowHandle, title); //設定視窗標題 } } bool EnumWindCallback(IntPtr hwnd, IntPtr lParam) { IntPtr pid = IntPtr.Zero; GetWindowThreadProcessId(hwnd, ref pid); if (pid == lParam) //判斷當前視窗是否屬於本程序 { myWindowHandle = hwnd; return false; } return true; } public IntPtr FindU3DHandle() { var found = IntPtr.Zero; var tid = GetCurrentThreadId(); EnumThreadWindows(tid, delegate (IntPtr hwnd, IntPtr param) { var sb = new StringBuilder(256); GetClassNameW(hwnd, sb, 256); if (sb.ToString() != "UnityWndClass") { return true; } found = hwnd; return true; }, IntPtr.Zero); return found; } public const int SWP_NOSIZE = 0x0001; public const int SWP_NOMOVE = 0x0002; public const int SW_SHOWNORMAL = 1; public const int SW_SHOWMINIMIZED = 2; public const int SW_SHOWMAXIMIZED = 3; public const int CLIP_TEXT_DATA = 13; public const int GWL_STYLE = -16; public const uint WS_POPUP = 0x80000000; public const uint WS_CAPTION = 0xC00000; /* WS_BORDER | WS_DLGFRAME */ public const uint WS_MINIMIZEBOX = 0x20000; public const uint WS_MAXIMIZEBOX = 0x10000; public const uint WS_SYSMENU = 0x80000; public const uint WS_THICKFRAME = 0x40000; public const uint MB_OK = 0x00000000; public const uint MB_OKCANCEL = 0x00000001; public const uint MB_ABORTRETRYIGNORE = 0x00000002; public const uint MB_YESNOCANCEL = 0x00000003; public const uint MB_YESNO = 0x00000004; public const uint MB_RETRYCANCEL = 0x00000005; public const uint KLF_ACTIVATE = 0x00000001; public const uint KLF_SUBSTITUTE_OK = 0x00000002; public const uint KLF_REORDER = 0x00000008; public const uint KLF_NOTELLSHELL = 0x00000080; public const uint KLF_SETFORPROCESS = 0x00000100; public const uint KLF_SHIFTLOCK = 0x00010000; public const uint KLF_RESET = 0x40000000; 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; } } public struct POINT { public int X; public int Y; } #region User32.dll 函式 /// <summary> /// 該函式檢索一指定視窗的客戶區域或整個螢幕的顯示裝置上下文環境的控制代碼,以後可以在GDI函式中使用該控制代碼來在裝置上下文環境中繪圖。hWnd:裝置上下文環境被檢索的視窗的控制代碼 /// </summary> [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr GetDC(IntPtr hWnd); /// <summary> /// 函式釋放裝置上下文環境(DC)供其他應用程式使用。 /// </summary> [DllImport("user32.dll")] public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); /// <summary> /// 該函式返回桌面視窗的控制代碼。桌面視窗覆蓋整個螢幕。 /// </summary> [DllImport("user32.dll")] static public extern IntPtr GetDesktopWindow(); /// <summary> /// 該函式設定指定視窗的顯示狀態。 /// </summary> [DllImport("user32.dll")] static public extern bool ShowWindow(IntPtr hWnd, short State); /// <summary> /// 通過傳送重繪訊息 WM_PAINT 給目標窗體來更新目標窗體客戶區的無效區域。 /// </summary> [DllImport("user32.dll")] static public extern bool UpdateWindow(IntPtr hWnd); /// <summary> /// 該函式將建立指定視窗的執行緒設定到前臺,並且啟用該視窗。鍵盤輸入轉向該視窗,併為使用者改各種可視的記號。系統給建立前臺視窗的執行緒分配的許可權稍高於其他執行緒。 /// </summary> [DllImport("user32.dll")] static public extern bool SetForegroundWindow(IntPtr hWnd); /// <summary> /// 該函式改變一個子視窗,彈出式視窗式頂層視窗的尺寸,位置和Z序。 /// </summary> [DllImport("user32.dll")] static public extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, uint flags); /// <summary> /// 開啟剪下板 /// </summary> [DllImport("user32.dll")] static public extern bool OpenClipboard(IntPtr hWndNewOwner); /// <summary> /// 關閉剪下板 /// </summary> [DllImport("user32.dll")] static public extern bool CloseClipboard(); /// <summary> /// 清空剪下板</summary> [DllImport("user32.dll")] static public extern bool EmptyClipboard(); /// <summary> /// 將存放有資料的記憶體塊放入剪下板的資源管理中 /// </summary> [DllImport("user32.dll")] static public extern IntPtr SetClipboardData(uint Format, IntPtr hData); /// <summary> /// 在一個矩形中裝載指定選單條目的螢幕座標資訊 /// </summary> [DllImport("user32.dll")] public static extern bool GetMenuItemRect(IntPtr hWnd, IntPtr hMenu, uint Item, ref RECT rc); [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] /// <summary> /// 該函式獲得一個指定子視窗的父視窗控制代碼。 /// </summary> public static extern IntPtr GetParent(IntPtr hWnd); /// <summary> /// 該函式將指定的訊息傳送到一個或多個視窗。此函式為指定的視窗呼叫視窗程式,直到視窗程式處理完訊息再返回。  /// </summary> /// <param name="hWnd">其視窗程式將接收訊息的視窗的控制代碼</param> /// <param name="msg">指定被髮送的訊息</param> /// <param name="wParam">指定附加的訊息指定資訊</param> /// <param name="lParam">指定附加的訊息指定資訊</param> /// <returns></returns> [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); [DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref RECT lParam); /// <summary> /// 該函式將一個訊息放入(寄送)到與指定視窗建立的執行緒相聯絡訊息佇列裡 /// </summary> [DllImport("user32.dll")] public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, int lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern bool UnhookWindowsHookEx(IntPtr hhook); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam); /// <summary> /// 該函式對指定的視窗設定鍵盤焦點。 /// </summary> [DllImport("user32.dll")] public static extern IntPtr SetFocus(IntPtr hWnd); /// <summary> /// 該函式在指定的矩形裡寫入格式化文字,根據指定的方法對文字格式化(擴充套件的製表符,字元對齊、折行等)。 /// </summary> [DllImport("user32.dll")] public extern static int DrawText(IntPtr hdc, string lpString, int nCount, ref RECT lpRect, int uFormat); /// <summary> /// 該函式改變指定子視窗的父視窗。 /// </summary> [DllImport("user32.dll")] public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent); /// <summary> /// 獲取對話方塊中子視窗控制元件的控制代碼 /// </summary> [DllImport("user32.dll")] public extern static IntPtr GetDlgItem(IntPtr hDlg, int nControlID); /// <summary> /// 該函式獲取視窗客戶區的座標。 /// </summary> [DllImport("user32.dll")] public extern static int GetClientRect(IntPtr hWnd, ref RECT rc); /// <summary> /// 該函式向指定的窗體新增一個矩形,然後視窗客戶區域的這一部分將被重新繪製。 /// </summary> [DllImport("user32.dll")] public extern static int InvalidateRect(IntPtr hWnd, IntPtr rect, int bErase); /// <summary> /// 該函式產生對其他執行緒的控制,如果一個執行緒沒有其他訊息在其訊息佇列裡。 /// </summary> [DllImport("user32.dll")] public static extern bool WaitMessage(); /// <summary> /// 該函式從一個與應用事例相關的可執行檔案(EXE檔案)中載入指定的游標資源. /// </summary> [DllImport("user32.dll")] public static extern IntPtr LoadCursor(IntPtr hInstance, uint cursor); /// <summary> /// 該函式確定游標的形狀。 /// </summary> [DllImport("user32.dll")] public static extern IntPtr SetCursor(IntPtr hCursor); /// <summary> /// 確定當前焦點位於哪個控制元件上。 /// </summary> [DllImport("user32.dll")] public static extern IntPtr GetFocus(); /// <summary> /// 該函式從當前執行緒中的視窗釋放滑鼠捕獲,並恢復通常的滑鼠輸入處理。捕獲滑鼠的視窗接收所有的滑鼠輸入(無論游標的位置在哪裡),除非點選滑鼠鍵時,游標熱點在另一個執行緒的視窗中。 /// </summary> [DllImport("user32.dll")] public static extern bool ReleaseCapture(); /// <summary> /// 該函式返回指定視窗的邊框矩形的尺寸。該尺寸以相對於螢幕座標左上角的螢幕座標給出。 /// </summary> [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect); /// <summary> /// /// </summary> [DllImport("user32.dll")] public static extern bool SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool redraw); /// <summary> /// 該函式檢取指定虛擬鍵的狀態。 /// </summary> [DllImport("user32.dll")] public static extern ushort GetKeyState(int virtKey); /// <summary> /// 該函式改變指定視窗的位置和尺寸。對於頂層視窗,位置和尺寸是相對於螢幕的左上角的:對於子視窗,位置和尺寸是相對於父視窗客戶區的左上角座標的。 /// </summary> [DllImport("user32.dll")] public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint); /// <summary> /// 該函式改變指定視窗的屬性 /// </summary> [DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); /// <summary> /// 該函式檢索指定視窗客戶區域或整個螢幕的顯示裝置上下文環境的控制代碼,在隨後的GDI函式中可以使用該控制代碼在裝置上下文環境中繪圖。 /// </summary> [DllImport("user32.dll")] public static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hRegion, uint flags); /// <summary> /// 獲取整個視窗(包括邊框、滾動條、標題欄、選單等)的裝置場景 返回值 Long。 /// </summary> [DllImport("user32.dll")] public static extern IntPtr GetWindowDC(IntPtr hWnd); /// <summary> /// 該函式用指定的畫刷填充矩形,此函式包括矩形的左上邊界,但不包括矩形的右下邊界。 /// </summary> [DllImport("user32.dll")] public static extern int FillRect(IntPtr hDC, ref RECT rect, IntPtr hBrush); /// <summary> /// 該函式改變指定視窗的標題欄的文字內容 /// </summary> [DllImport("user32.dll")] public static extern int SetWindowText(IntPtr hWnd, string text); /// <summary> /// 用於得到被定義的系統資料或者系統配置資訊. /// </summary> [DllImport("user32.dll")] static public extern int GetSystemMetrics(int nIndex); /// <summary> /// 該函式顯示或隱藏所指定的滾動條。 /// </summary> [DllImport("user32.dll")] public static extern int ShowScrollBar(IntPtr hWnd, int bar, int show); /// <summary> /// 該函式可以啟用一個或兩個滾動條箭頭或是使其失效。 /// </summary> [DllImport("user32.dll")] public static extern int EnableScrollBar(IntPtr hWnd, uint flags, uint arrows); /// <summary> /// 該函式將指定的視窗設定到Z序的頂部。 /// </summary> [DllImport("user32.dll")] public static extern int BringWindowToTop(IntPtr hWnd); /// <summary> /// 該函式滾動指定窗體客戶區域的目錄。 /// </summary> [DllImport("user32.dll")] static public extern int ScrollWindowEx(IntPtr hWnd, int dx, int dy, ref RECT rcScroll, ref RECT rcClip, IntPtr UpdateRegion, ref RECT rcInvalidated, uint flags); /// <summary> /// 該函式確定給定的視窗控制代碼是否識別一個已存在的視窗。 /// </summary> [DllImport("user32.dll")] public static extern int IsWindow(IntPtr hWnd); /// <summary> /// 該函式將256個虛擬鍵的狀態拷貝到指定的緩衝區中。 /// </summary> [DllImport("user32.dll")] public static extern int GetKeyboardState(byte[] pbKeyState); /// <summary> /// 該函式將指定的虛擬鍵碼和鍵盤狀態翻譯為相應的字元或字串。該函式使用由給定的鍵盤佈局控制代碼標識的物理鍵盤佈局和輸入語言來翻譯程式碼。 /// </summary> [DllImport("user32.dll")] public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState); public delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lparam); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern bool EnumThreadWindows(int thread, EnumWindowsProc proc, IntPtr param); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetClassNameW(IntPtr hwnd, StringBuilder str, int len); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowTextW(IntPtr hwnd, StringBuilder str, int len); [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern int GetCurrentThreadId(); #endregion }