Unity3D 获取主窗口句柄

本文介绍了一个使用C#和DllImport调用Windows API的方法,在Unity3D中获取主窗口句柄。通过EnumWindows、GetParent、GetWindowThreadProcessId等函数,遍历并检查窗口句柄,匹配当前进程ID,最终找到并返回主窗口句柄。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class C {

    public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr GetParent(IntPtr hWnd);
    [DllImport("user32.dll")]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);

    [DllImport("kernel32.dll")]
    public static extern void SetLastError(uint dwErrCode);


    public static IntPtr GetProcessWnd()
    {
        IntPtr ptrWnd = IntPtr.Zero;
        uint pid = (uint)Process.GetCurrentProcess().Id;  // 当前进程 ID

        bool bResult = EnumWindows(new WNDENUMPROC(delegate (IntPtr hwnd, uint lParam)
        {
            uint id = 0;

            if (GetParent(hwnd) == IntPtr.
### 获取 Unity 编辑器窗口句柄 在 Unity 中获取编辑器窗口的句柄(HWND)可以通过多种方式实现,特别是当目标是为了与外部程序进行交互或执行自动化操作时。一种常见方法是利用 C++ 创建一个动态链接库 (DLL),该 DLL 可以访问操作系统级别的 API 来检索当前活动窗口的信息。 对于 Windows 平台而言,可以编写如下所示的一个简单 C++ 函数来返回 Unity 编辑器窗口的句柄: ```cpp // GetUnityEditorHandle.cpp #include <windows.h> extern "C" { __declspec(dllexport) HWND GetUnityEditorHandle(const char* titlePart) { return FindWindow(NULL, titlePart); } } ``` 此代码片段定义了一个名为 `GetUnityEditorHandle` 的导出函数,它接受一个字符串参数作为窗口标题的一部分,并尝试找到匹配的第一个顶级窗口并返回其句柄[^3]。 接着,在 Unity 项目里创建一个新的 C# 类文件,用来加载上述编写的原生库以及声明要调用的方法签名: ```csharp using System; using System.Runtime.InteropServices; public static class NativeMethods { [DllImport("MyNativeLib")] public static extern IntPtr GetUnityEditorHandle([MarshalAs(UnmanagedType.LPStr)] string title); } public class EditorWindowHandler : MonoBehaviour { private void Start() { // 假设 Unity 编辑器窗口标题包含 "Unity" IntPtr hwnd = NativeMethods.GetUnityEditorHandle("Unity"); if(hwnd != IntPtr.Zero){ Console.WriteLine($"Found editor handle: {hwnd}"); } else{ Console.WriteLine("Failed to find editor handle."); } } } ``` 这段 C# 代码展示了如何导入之前构建好的本地库 (`MyNativeLib`) 和其中公开的方法 `GetUnityEditorHandle` 。之后可以在游戏对象上附加此类组件实例化后自动运行一次查找逻辑[^2]。 需要注意的是,由于安全性和稳定性考虑,直接操纵其他进程尤其是像 IDE 这样的复杂应用可能会带来风险;因此建议仅限于测试环境内谨慎使用这类技术手段。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值