[{"content":"Godot中使用GDScript 实现 Bilibili 扫码登录获取 SESSDATA 流程 本文档总结 Godot 项目中通过 Bilibili 扫码登录获取 SESSDATA 的核心逻辑，代码位于脚本的 需要用户登陆 区域。\n功能概述 调用 Bilibili 官方接口生成登录二维码，在应用内展示。 定时轮询二维码扫描状态，检测用户是否已扫码并确认登录。 扫码成功后通过登录链接交换得到 SESSDATA，并持久化到项目存储中。 提供回调机制通知调用方登录结果（成功/失败）。 源代码 # 扫码登录相关变量 var qr_window: Window = null var _poll_timer: Timer var on_qr_login_result: Callable func start_qr_login(login_callback: Callable) -\u0026gt; void: on_qr_login_result = login_callback var http = HTTPRequest.new() add_child(http) http.request_completed.connect(_on_qr_generated) var err = http.request(\u0026#34;https://passport.bilibili.com/x/passport-login/web/qrcode/generate\u0026#34;, PackedStringArray(), HTTPClient.METHOD_GET) func _on_qr_generated(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -\u0026gt; void: if response_code != 200: return var json = JSON.new() if json.parse(body.get_string_from_utf8()) != OK: return var data = json.get_data()[\u0026#34;data\u0026#34;] var url = data[\u0026#34;url\u0026#34;] var qrcode_key = data[\u0026#34;qrcode_key\u0026#34;] _display_qrcode(url) _poll_login_status(qrcode_key) func _display_qrcode(content: String) -\u0026gt; void: qr_window = preload(\u0026#34;res://Scene/Log_in.tscn\u0026#34;).instantiate() qr_window.close_requested.connect(_on_qr_window_closed) add_child(qr_window) var encoded = content.uri_encode() var qr_api = \u0026#34;https://api.qrserver.com/v1/create-qr-code/?size=200x200\u0026amp;data=\u0026#34; + encoded var img_request = HTTPRequest.new() add_child(img_request) img_request.request_completed.connect(func(_r, _c, _h, body): if not is_instance_valid(qr_window): return var img = Image.new() if img.load_png_from_buffer(body) == OK: var tex = ImageTexture.create_from_image(img) qr_window.get_node(\u0026#34;QRImage\u0026#34;).texture = tex else: push_error(\u0026#34;二维码图片加载失败\u0026#34;) ) img_request.request(qr_api, PackedStringArray(), HTTPClient.METHOD_GET) func _on_qr_window_closed() -\u0026gt; void: if qr_window: qr_window.queue_free() qr_window = null if _poll_timer: _poll_timer.stop() _poll_timer.queue_free() _poll_timer = null if on_qr_login_result: on_qr_login_result.call(false) func _close_qr_window() -\u0026gt; void: if qr_window: qr_window.queue_free() qr_window = null if _poll_timer: _poll_timer.stop() _poll_timer.queue_free() _poll_timer = null func _poll_login_status(qrcode_key: String) -\u0026gt; void: _poll_timer = Timer.new() _poll_timer.wait_time = 2.0 _poll_timer.autostart = true _poll_timer.timeout.connect(_check_qr_status.bind(qrcode_key)) add_child(_poll_timer) func _check_qr_status(qrcode_key: String) -\u0026gt; void: var http = HTTPRequest.new() add_child(http) http.request_completed.connect(func(result, response_code, headers, body): if response_code != 200: return var json = JSON.new() if json.parse(body.get_string_from_utf8()) != OK: return var data = json.get_data()[\u0026#34;data\u0026#34;] var code = data[\u0026#34;code\u0026#34;] if code == 0: _exchange_cookie(data[\u0026#34;url\u0026#34;]) if on_qr_login_result: on_qr_login_result.call(true) _close_qr_window() elif code == 86038: if on_qr_login_result: on_qr_login_result.call(false) _close_qr_window() ) http.request(\u0026#34;https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=\u0026#34; + qrcode_key, PackedStringArray(), HTTPClient.METHOD_GET) func _exchange_cookie(login_url: String) -\u0026gt; void: var http = HTTPRequest.new() add_child(http) http.request_completed.connect(func(result, response_code, headers, body): for header in headers: if header.begins_with(\u0026#34;Set-Cookie: SESSDATA=\u0026#34;): var sess = header.split(\u0026#34;=\u0026#34;)[1].split(\u0026#34;;\u0026#34;)[0] GdScriptFunc.set_data(\u0026#34;AccountData\u0026#34;,\u0026#34;SESSDATA\u0026#34;,sess) break ) http.request(login_url, PackedStringArray(), HTTPClient.METHOD_GET) 核心流程 发起登录\n调用 start_qr_login(login_callback) 开始流程，传入一个回调函数用于接收登录结果。\n生成二维码\n请求 /x/passport-login/web/qrcode/generate 接口，获取 url（登录页面链接）和 qrcode_key（轮询标识）。\nURL 被编码后作为参数调用第三方二维码生成 API（api.qrserver.com），生成二维码图片并显示在 UI 窗口上。 展示二维码窗口\n实例化一个预制的场景（res://Scene/Log_in.tscn），将二维码图片设置到 QRImage 节点上，并监听窗口关闭事件以终止流程。\n轮询扫码状态\n启动一个 Timer，每 2 秒请求 /x/passport-login/web/qrcode/poll 接口，携带 qrcode_key。\n若返回 code == 0 表示登录成功，执行 _exchange_cookie 兑换 SESSDATA。 若返回 code == 86038 表示二维码已失效，终止流程。 其他状态继续轮询。 兑换 SESSDATA\n使用回调返回的 url（登录票据链接）发送 GET 请求，从响应头 Set-Cookie 中提取 SESSDATA 字段。\nGdScriptFunc.set_data(\u0026quot;AccountData\u0026quot;, \u0026quot;SESSDATA\u0026quot;, sess) 将值持久化。 回调通知\n无论成功或失败（二维码过期/窗口关闭），最终调用 on_qr_login_result 回调函数，传入布尔值表示登录是否成功。\n关键函数说明 start_qr_login(login_callback: Callable) 入口函数，保存回调、创建 HTTPRequest 发起生成二维码的请求。 _on_qr_generated(result, response_code, headers, body) 解析二维码生成接口的响应，获取 url 和 qrcode_key，然后调用 _display_qrcode 和 _poll_login_status。 _display_qrcode(content: String) 实例化 UI 窗口（Log_in.tscn），通过第三方 API 将登录链接转为二维码图片并加载到窗口纹理上。 _poll_login_status(qrcode_key: String) 创建定时器，每 2 秒触发 _check_qr_status 轮询。 _check_qr_status(qrcode_key: String) 调用轮询接口，根据返回的 code 决定下一步： code == 0：登录成功，调用 _exchange_cookie 并关闭窗口，回调 true。 code == 86038：失效，关闭窗口，回调 false。 其他：继续等待。 _exchange_cookie(login_url: String) 请求登录票据 URL，从响应头中解析 SESSDATA，存入 AccountData。 _on_qr_window_closed() 窗口关闭时的清理：销毁窗口、停用定时器，并回调 false。 环境依赖 Godot Engine 4.x（使用 HTTPRequest、Timer、Window 等节点） 项目全局方法 GdScriptFunc.set_data/get_data 用于数据持久化 UI 模板 res://Scene/Log_in.tscn 必须包含名为 QRImage 的 TextureRect 节点用于展示二维码 流程图 start_qr_login() ├─ HTTP GET /qrcode/generate │ └─ 获取 url, qrcode_key ├─ _display_qrcode(url) │ └─ 显示二维码窗口 └─ _poll_login_status(qrcode_key) └─ 定时器每2s → _check_qr_status() ├─ code == 0 → _exchange_cookie(login_url) │ └─ 提取并保存 SESSDATA → 回调 success(true) ├─ code == 86038 → 回调 success(false) └─ 其他 → 继续轮询 注意事项 轮询间隔固定 2 秒，可根据实际需求调整。 二维码生成使用了外部 API，需确保网络畅通且遵守服务条款。 SESSDATA 的有效期由 Bilibili 控制，过期后需重新登录。 若二维码窗口被用户主动关闭，会视为登录放弃并回调 false。 整个流程依赖 Godot 的场景树和异步机制，应在主线程环境（如 Node 子类）中执行。 示例调用 start_qr_login(func(success: bool): if success: print(\u0026#34;登录成功，SESSDATA 已保存\u0026#34;) else: print(\u0026#34;登录失败或取消\u0026#34;) ) ","permalink":"https://by-chi.github.io/posts/%E7%94%A8gdscript%E5%AE%9E%E7%8E%B0%E6%89%AB%E7%A0%81%E7%99%BB%E9%99%86bilibili%E8%8E%B7%E5%8F%96%E5%88%B0sessdata/","summary":"\u003ch1 id=\"godot中使用gdscript-实现-bilibili-扫码登录获取-sessdata-流程\"\u003eGodot中使用GDScript 实现 Bilibili 扫码登录获取 SESSDATA 流程\u003c/h1\u003e\n\u003cp\u003e本文档总结 Godot 项目中通过 Bilibili 扫码登录获取 \u003ccode\u003eSESSDATA\u003c/code\u003e 的核心逻辑，代码位于脚本的 \u003ccode\u003e需要用户登陆\u003c/code\u003e 区域。\u003c/p\u003e\n\u003ch2 id=\"功能概述\"\u003e功能概述\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e调用 Bilibili 官方接口生成登录二维码，在应用内展示。\u003c/li\u003e\n\u003cli\u003e定时轮询二维码扫描状态，检测用户是否已扫码并确认登录。\u003c/li\u003e\n\u003cli\u003e扫码成功后通过登录链接交换得到 \u003ccode\u003eSESSDATA\u003c/code\u003e，并持久化到项目存储中。\u003c/li\u003e\n\u003cli\u003e提供回调机制通知调用方登录结果（成功/失败）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"源代码\"\u003e源代码\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# 扫码登录相关变量\nvar qr_window: Window = null\nvar _poll_timer: Timer\nvar on_qr_login_result: Callable\n\nfunc start_qr_login(login_callback: Callable) -\u0026gt; void:\n\ton_qr_login_result = login_callback\n\tvar http = HTTPRequest.new()\n\tadd_child(http)\n\thttp.request_completed.connect(_on_qr_generated)\n\tvar err = http.request(\u0026#34;https://passport.bilibili.com/x/passport-login/web/qrcode/generate\u0026#34;, PackedStringArray(), HTTPClient.METHOD_GET)\n\nfunc _on_qr_generated(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -\u0026gt; void:\n\tif response_code != 200: return\n\tvar json = JSON.new()\n\tif json.parse(body.get_string_from_utf8()) != OK: return\n\tvar data = json.get_data()[\u0026#34;data\u0026#34;]\n\tvar url = data[\u0026#34;url\u0026#34;]\n\tvar qrcode_key = data[\u0026#34;qrcode_key\u0026#34;]\n\t_display_qrcode(url)\n\t_poll_login_status(qrcode_key)\n\nfunc _display_qrcode(content: String) -\u0026gt; void:\n\tqr_window = preload(\u0026#34;res://Scene/Log_in.tscn\u0026#34;).instantiate()\n\tqr_window.close_requested.connect(_on_qr_window_closed)\n\tadd_child(qr_window)\n\tvar encoded = content.uri_encode()\n\tvar qr_api = \u0026#34;https://api.qrserver.com/v1/create-qr-code/?size=200x200\u0026amp;data=\u0026#34; + encoded\n\tvar img_request = HTTPRequest.new()\n\tadd_child(img_request)\n\timg_request.request_completed.connect(func(_r, _c, _h, body):\n\t\tif not is_instance_valid(qr_window):\n\t\t\treturn\n\t\tvar img = Image.new()\n\t\tif img.load_png_from_buffer(body) == OK:\n\t\t\tvar tex = ImageTexture.create_from_image(img)\n\t\t\tqr_window.get_node(\u0026#34;QRImage\u0026#34;).texture = tex\n\t\telse:\n\t\t\tpush_error(\u0026#34;二维码图片加载失败\u0026#34;)\n\t)\n\timg_request.request(qr_api, PackedStringArray(), HTTPClient.METHOD_GET)\n\nfunc _on_qr_window_closed() -\u0026gt; void:\n\tif qr_window:\n\t\tqr_window.queue_free()\n\t\tqr_window = null\n\tif _poll_timer:\n\t\t_poll_timer.stop()\n\t\t_poll_timer.queue_free()\n\t\t_poll_timer = null\n\tif on_qr_login_result:\n\t\ton_qr_login_result.call(false)\n\nfunc _close_qr_window() -\u0026gt; void:\n\tif qr_window:\n\t\tqr_window.queue_free()\n\t\tqr_window = null\n\tif _poll_timer:\n\t\t_poll_timer.stop()\n\t\t_poll_timer.queue_free()\n\t\t_poll_timer = null\n\nfunc _poll_login_status(qrcode_key: String) -\u0026gt; void:\n\t_poll_timer = Timer.new()\n\t_poll_timer.wait_time = 2.0\n\t_poll_timer.autostart = true\n\t_poll_timer.timeout.connect(_check_qr_status.bind(qrcode_key))\n\tadd_child(_poll_timer)\n\nfunc _check_qr_status(qrcode_key: String) -\u0026gt; void:\n\tvar http = HTTPRequest.new()\n\tadd_child(http)\n\thttp.request_completed.connect(func(result, response_code, headers, body):\n\t\tif response_code != 200: return\n\t\tvar json = JSON.new()\n\t\tif json.parse(body.get_string_from_utf8()) != OK: return\n\t\tvar data = json.get_data()[\u0026#34;data\u0026#34;]\n\t\tvar code = data[\u0026#34;code\u0026#34;]\n\t\tif code == 0:\n\t\t\t_exchange_cookie(data[\u0026#34;url\u0026#34;])\n\t\t\tif on_qr_login_result:\n\t\t\t\ton_qr_login_result.call(true)\n\t\t\t_close_qr_window()\n\t\telif code == 86038:\n\t\t\tif on_qr_login_result:\n\t\t\t\ton_qr_login_result.call(false)\n\t\t\t_close_qr_window()\n\t)\n\thttp.request(\u0026#34;https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=\u0026#34; + qrcode_key, PackedStringArray(), HTTPClient.METHOD_GET)\n\nfunc _exchange_cookie(login_url: String) -\u0026gt; void:\n\tvar http = HTTPRequest.new()\n\tadd_child(http)\n\thttp.request_completed.connect(func(result, response_code, headers, body):\n\t\tfor header in headers:\n\t\t\tif header.begins_with(\u0026#34;Set-Cookie: SESSDATA=\u0026#34;):\n\t\t\t\tvar sess = header.split(\u0026#34;=\u0026#34;)[1].split(\u0026#34;;\u0026#34;)[0]\n\t\t\t\tGdScriptFunc.set_data(\u0026#34;AccountData\u0026#34;,\u0026#34;SESSDATA\u0026#34;,sess)\n\t\t\t\tbreak\n\t)\n\thttp.request(login_url, PackedStringArray(), HTTPClient.METHOD_GET)\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"核心流程\"\u003e核心流程\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e发起登录\u003c/strong\u003e\u003cbr\u003e\n调用 \u003ccode\u003estart_qr_login(login_callback)\u003c/code\u003e 开始流程，传入一个回调函数用于接收登录结果。\u003c/p\u003e","title":"用GDScript实现扫码登陆Bilibili获取到SESSDATA"},{"content":"今天找到了一张小时候的照片(划水) 大概是13年前吧,那是我才4岁 当看到这张图时,我顺着碎片的记忆寻找过去, 记得那是我们一家在河北省承德居住,爸爸在哪里打工,大概是建高铁铁路,具体什么职务就不记得了\u0026hellip; 好怀念小时候啊。\n","permalink":"https://by-chi.github.io/posts/%E6%88%91%E7%9A%84%E5%B0%8F%E6%97%B6%E5%80%99/","summary":"\u003ch2 id=\"今天找到了一张小时候的照片划水\"\u003e今天找到了一张小时候的照片(划水)\u003c/h2\u003e\n\u003ch3 id=\"大概是13年前吧那是我才4岁\"\u003e大概是13年前吧,那是我才4岁\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"图片\" loading=\"lazy\" src=\"/posts/%E6%88%91%E7%9A%84%E5%B0%8F%E6%97%B6%E5%80%99/1.png\"\u003e\n当看到这张图时,我顺着碎片的记忆寻找过去,\n记得那是我们一家在河北省承德居住,爸爸在哪里打工,大概是建高铁铁路,具体什么职务就不记得了\u0026hellip;\n好怀念小时候啊。\u003c/p\u003e","title":"我的小时候"},{"content":" By.Chi 关于我 💻 一个有点云的热爱技术的独立开发者，专注于 Godot 和 C# 游戏开发 📝 偶尔记录技术踩坑和经验或者划水分享生活 🎮 喜欢玩游戏 技能 语言：C#, Python, GDScript 工具：Godot,VS Code 联系我 GitHub: @by-chi Email: by.chi@outlook.com Bilibili: bilibili ","permalink":"https://by-chi.github.io/about/","summary":"\u003cdiv style=\"max-width: 700px; margin: 0 auto;\"\u003e\n\u003c!-- 头像 + 一句话介绍 --\u003e\n\u003cdiv style=\"text-align: center; margin-bottom: 2rem;\"\u003e\n  \u003cimg src=\"/web-app-manifest-512x512.png\" alt=\"我的头像\" style=\"display: block; width: 120px; height: 120px; object-fit: cover; border-radius: 50%; border: 3px solid #ccc; margin: 0 auto 2rem; box-shadow: 0 2px 12px rgba(0,0,0,0.1);\"\u003e\n  \u003ch2 style=\"font-weight: 400; margin-top: 1rem;\"\u003eBy.Chi\u003c/h2\u003e\n\u003c/div\u003e\n\u003ch2 id=\"关于我\"\u003e关于我\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e💻 一个有点云的热爱技术的独立开发者，专注于 Godot 和 C# 游戏开发\u003c/li\u003e\n\u003cli\u003e📝 偶尔记录技术踩坑和经验或者划水分享生活\u003c/li\u003e\n\u003cli\u003e🎮 喜欢玩游戏\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"技能\"\u003e技能\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e语言\u003c/strong\u003e：C#, Python, GDScript\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e工具\u003c/strong\u003e：Godot,VS Code\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"联系我\"\u003e联系我\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGitHub: \u003ca href=\"https://github.com/by-chi\"\u003e@by-chi\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEmail: \u003ca href=\"mailto:by.chi@outlook.com\"\u003eby.chi@outlook.com\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBilibili: \u003ca href=\"https://space.bilibili.com/1909594131\"\u003ebilibili\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e","title":"About"},{"content":"可以利用DllImport导入SetWindowLong来设置窗口样式 具体代码: WindowsApiManager.cs\nusing System.Runtime.InteropServices; using Godot; public partial class WindowsApiManager : Node { private nint _hWnd; [DllImport(\u0026#34;user32.dll\u0026#34;)] public static extern nint GetActiveWindow(); [DllImport(\u0026#34;user32.dll\u0026#34;)] private static extern int SetWindowLong(nint hWnd, int nIndex, uint dwNewLong); public override void _Ready() { _hWnd = GetActiveWindow(); _ = SetWindowLong(_hWnd, -20, 524416u); } public void SetClickThrough(bool clickthrough) { if (clickthrough) { _ = SetWindowLong(_hWnd, -20, 524448u); } else { _ = SetWindowLong(_hWnd, -20, 524416u); } } } MouseDetection.cs\nusing Godot; public partial class MouseDetection : Node { private WindowsApiManager _api; private bool _clickthrough = true; public override void _Ready() { _api = GetNode\u0026lt;WindowsApiManager\u0026gt;(\u0026#34;/root/WindowsApiManager\u0026#34;); _api.SetClickThrough(clickthrough: true); } public override void _PhysicsProcess(double _) { DetectPassthrough(); } private void DetectPassthrough() { Viewport viewport = GetViewport(); Image img = viewport.GetTexture().GetImage(); Rect2 rect = viewport.GetVisibleRect(); Vector2 mousePosition = viewport.GetMousePosition(); int viewX = (int)((int)mousePosition.X + rect.Position.X); int viewY = (int)((int)mousePosition.Y + rect.Position.Y); int x = (int)(img.GetSize().X * viewX / rect.Size.X); int y = (int)(img.GetSize().Y * viewY / rect.Size.Y); if (x \u0026lt; img.GetSize().X \u0026amp;\u0026amp; x \u0026gt;= 0 \u0026amp;\u0026amp; y \u0026lt; img.GetSize().Y \u0026amp;\u0026amp; y \u0026gt;= 0) { SetClickability(img.GetPixel(x, y).A \u0026gt;= 1f); } img.Dispose(); } private void SetClickability(bool clickable) { if (clickable != _clickthrough) { _clickthrough = clickable; _api.SetClickThrough(!clickable); } } } 使用方法: 将WindowsApiManager.cs设为自动加载脚本\n整体思路: 每帧获取当前窗口图像,并判断鼠标指针是否在图像了,如果在则设置窗口不可穿透,反之穿透\n","permalink":"https://by-chi.github.io/posts/godot-windows%E5%B9%B3%E5%8F%B0%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E5%A4%84%E7%90%86%E9%BC%A0%E6%A0%87%E7%A9%BF%E9%80%8F/","summary":"\u003ch2 id=\"可以利用dllimport导入setwindowlong来设置窗口样式\"\u003e可以利用DllImport导入SetWindowLong来设置窗口样式\u003c/h2\u003e\n\u003ch3 id=\"具体代码\"\u003e具体代码:\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eWindowsApiManager.cs\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-csharp\" data-lang=\"csharp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Runtime.InteropServices\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eGodot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003epartial\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eWindowsApiManager\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003enint\u003c/span\u003e \u003cspan class=\"n\"\u003e_hWnd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e\t[DllImport(\u0026#34;user32.dll\u0026#34;)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"kd\"\u003eextern\u003c/span\u003e \u003cspan class=\"n\"\u003enint\u003c/span\u003e \u003cspan class=\"n\"\u003eGetActiveWindow\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e\t[DllImport(\u0026#34;user32.dll\u0026#34;)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"kd\"\u003eextern\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eSetWindowLong\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enint\u003c/span\u003e \u003cspan class=\"n\"\u003ehWnd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003enIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003edwNewLong\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003eoverride\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003e_Ready\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003e_hWnd\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetActiveWindow\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003e_\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSetWindowLong\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_hWnd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e524416\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eSetClickThrough\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003eclickthrough\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eclickthrough\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"n\"\u003e_\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSetWindowLong\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_hWnd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e524448\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"n\"\u003e_\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSetWindowLong\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_hWnd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e524416\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eMouseDetection.cs\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-csharp\" data-lang=\"csharp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eGodot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003epartial\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMouseDetection\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003eWindowsApiManager\u003c/span\u003e \u003cspan class=\"n\"\u003e_api\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003e_clickthrough\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003eoverride\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003e_Ready\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003e_api\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetNode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWindowsApiManager\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/root/WindowsApiManager\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003e_api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSetClickThrough\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eclickthrough\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003eoverride\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003e_PhysicsProcess\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003edouble\u003c/span\u003e \u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eDetectPassthrough\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eDetectPassthrough\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eViewport\u003c/span\u003e \u003cspan class=\"n\"\u003eviewport\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetViewport\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eImage\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eviewport\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetTexture\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eGetImage\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eRect2\u003c/span\u003e \u003cspan class=\"n\"\u003erect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eviewport\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetVisibleRect\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eVector2\u003c/span\u003e \u003cspan class=\"n\"\u003emousePosition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eviewport\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMousePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eviewX\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)((\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003emousePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eX\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003erect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eviewY\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)((\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003emousePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eY\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003erect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eY\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetSize\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eX\u003c/span\u003e \u003cspan class=\"p\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eviewX\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u003c/span\u003e \u003cspan class=\"n\"\u003erect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSize\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetSize\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eY\u003c/span\u003e \u003cspan class=\"p\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eviewY\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u003c/span\u003e \u003cspan class=\"n\"\u003erect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSize\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eY\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetSize\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eX\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetSize\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eY\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"n\"\u003eSetClickability\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetPixel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eA\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"m\"\u003e1f\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDispose\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eSetClickability\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003eclickable\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eclickable\u003c/span\u003e \u003cspan class=\"p\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003e_clickthrough\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"n\"\u003e_clickthrough\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eclickable\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"n\"\u003e_api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSetClickThrough\u003c/span\u003e\u003cspan class=\"p\"\u003e(!\u003c/span\u003e\u003cspan class=\"n\"\u003eclickable\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"使用方法\"\u003e使用方法:\u003c/h3\u003e\n\u003cp\u003e将\u003ccode\u003eWindowsApiManager.cs\u003c/code\u003e设为自动加载脚本\u003c/p\u003e","title":"Godot Windows平台如何自动处理鼠标穿透"}]