Game Maker透明置顶可点击穿透窗口实现问题求助
Game Maker悬浮层:置顶、透明、点击穿透解决方案
一、窗口置顶问题修复
你当前的DLLMakeWindowTop函数仅注释了SetWindowPos调用,需要正确实现并确保依赖库链接。另外Game Maker的窗口初始化逻辑可能会重置置顶状态,建议在窗口创建完成后(比如Room Start事件)调用该函数。
二、点击穿透实现
要实现点击穿透,需给窗口添加WS_EX_TRANSPARENT和WS_EX_LAYERED扩展样式,结合已有的DWM透明效果,让系统忽略窗口的鼠标事件。
三、完整DLL代码
#include "pch.h" #include <dwmapi.h> #include <windows.h> // 链接所需系统库 #pragma comment(lib, "user32.lib") #pragma comment(lib, "dwmapi.lib") extern "C" __declspec(dllexport) void DLLMakeWindowTransparent(HWND hwnd) { MARGINS margins = { -1, 0, 0, 0 }; DwmExtendFrameIntoClientArea(hwnd, &margins); } extern "C" __declspec(dllexport) void DLLMakeWindowTopmost(HWND hwnd) { // 设置窗口始终置顶,SWP_NOACTIVATE避免抢占焦点 SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); } extern "C" __declspec(dllexport) void DLLEnableClickThrough(HWND hwnd) { // 获取当前窗口扩展样式 LONG_PTR exStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE); // 添加透明和分层扩展样式 exStyle |= WS_EX_LAYERED | WS_EX_TRANSPARENT; SetWindowLongPtr(hwnd, GWL_EXSTYLE, exStyle); // 设置分层窗口透明度(保持完全不透明,由DWM处理背景透明) SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA); }
四、Game Maker GML调用示例
- 先在Game Maker中导入DLL,定义外部函数:
// 在全局初始化脚本中定义 external_define("YourOverlayDLL.dll", "DLLMakeWindowTransparent", dll_cdecl, ty_real, [ty_real]); external_define("YourOverlayDLL.dll", "DLLMakeWindowTopmost", dll_cdecl, ty_real, [ty_real]); external_define("YourOverlayDLL.dll", "DLLEnableClickThrough", dll_cdecl, ty_real, [ty_real]); // 获取Game Maker窗口句柄 var hwnd = window_get_handle(); // 调用函数实现所有效果 external_call(DLLMakeWindowTransparent, hwnd); external_call(DLLMakeWindowTopmost, hwnd); external_call(DLLEnableClickThrough, hwnd);
- 建议将上述代码放在
Room Start事件中执行,确保窗口已完成初始化。
注意事项
- 确保DLL编译架构与Game Maker一致(32位/64位),否则会调用失败。
- 若置顶效果偶尔失效,可在
Step事件中周期性调用DLLMakeWindowTopmost,防止其他窗口强制抢占置顶权限。 WS_EX_TRANSPARENT会让窗口忽略所有鼠标事件,若需部分区域可点击,可结合区域检测动态切换样式,或使用LWA_COLORKEY指定透明色实现精准穿透。
内容的提问来源于stack exchange,提问作者A356
相关产品推荐
相关产品推荐

