FLX*_*FLX 8 c# user32 unity-game-engine
我创建了一个无边框窗口应用程序和一个"假"标题栏来拖动它.
我正在使用user32.dll,
这开始拖动窗口(由统一IBeginDragHandler触发):
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int WM_NCLBUTTONUP = 0x00A2;
public const int WM_LBUTTONUP = 0x0202;
[DllImport("User32.dll")]
public static extern bool ReleaseCapture();
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
IntPtr window = GetActiveWindow();
...
...
ReleaseCapture();
SendMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, 0);
Run Code Online (Sandbox Code Playgroud)
这是为了停止拖动(不确定这部分):
ReleaseCapture();
SendMessage(window, WM_NCLBUTTONUP, HTCAPTION, 0);
SendMessage(window, WM_LBUTTONUP, HTCAPTION, 0);
Run Code Online (Sandbox Code Playgroud)
它在编辑器和构建上运行良好,但在developpement构建上产生错误:
发生了异常情况:已经递归调用了PlayerLoop内部函数.请通过示例项目联系客户支持,以便我们重现问题并对其进行故障排除.LauncherWindow:SendMessage(IntPtr,Int32,Int32,Int32)LauncherWindow:StartWindowDrag()(在E:\ Unity Projects\Crime Club Launcher\Assets\Scripts\Lib\LauncherWindow.cs:115)WindowDragZone:UnityEngine.EventSystems.IBeginDragHandler.OnBeginDrag (PointerEventData)(在E:\ Unity Projects\Crime Club Launcher\Assets\WindowDragZone.cs:9)UnityEngine.EventSystems.ExecuteEvents:Execute(IBeginDragHandler,BaseEventData)(在C:\ buildslave\unity\build\Extensions\guisystem\UnityEngine.UI\EventSystem\ExecuteEvents.cs:64)UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject,BaseEventData,EventFunction`1)(在C:\ buildslave\unity\build\Extensions\guisystem\UnityEngine.UI\EventSystem\ExecuteEvents) .cs:261)UnityEngine.EventSystems.PointerInputModule:ProcessDrag(PointerEventData)(在C:\ buildslave\unity\build\Extensions\guisystem\UnityEngine.UI\EventSystem\InputModules\PointerInputModule.cs:261)UnityEngine.EventSystems.StandaloneInputModule: ProcessMouseEvent(Int32)(在C:\ buildslave\unity\build\Exte nsions\guisystem\UnityEngine.UI\EventSystem\InputModules\StandaloneInputModule.cs:434)UnityEngine.EventSystems.StandaloneInputModule:ProcessMouseEvent()(在C:\ buildslave\unity\build\Extensions\guisystem\UnityEngine.UI\EventSystem\InputModules\StandaloneInputModule.cs:412)UnityEngine.EventSystems.StandaloneInputModule:Process()(在C:\ buildslave\unity\build\Extensions\guisystem\UnityEngine.UI\EventSystem\InputModules\StandaloneInputModule.cs:186)UnityEngine.EventSystems.EventSystem: Update()(在C:\ buildslave\unity\build\Extensions\guisystem\UnityEngine.UI\EventSystem\EventSystem.cs:283)
你怎么看待这件事 ?
编辑: 好的,所以我终于通过替换摆脱了这个错误
SendMessage(window, WM_NCLBUTTONDOWN, HTCAPTION, 0);
Run Code Online (Sandbox Code Playgroud)
通过:
private const int WM_SYSCOMMAND = 0x112;
private const int MOUSE_MOVE = 0xF012;
SendMessage(window, WM_SYSCOMMAND, MOUSE_MOVE, 0);
Run Code Online (Sandbox Code Playgroud)
现在我有一个最后的小问题:窗口被拖动,在鼠标释放时掉落,但我看起来窗口正在失去对以下内容的关注:第一次点击总是错过,我必须点击两次才能再次拖动或只需与统一应用程序进行交互.
我尝试在OnEndDrag中使用User32的函数:ShowWindow,SetActiveWindow,SetFocus等...我发现的所有内容都与该问题有关,但它们都没有明显效果,我仍然必须点击两次.
最后通过将 SendMessage() 替换为以下内容来摆脱此错误:
SendMessageCallback(window, WM_SYSCOMMAND, MOUSE_MOVE, 0, WindowDropCallback, 0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1229 次 |
| 最近记录: |