(C#、ユニティ)プロセスウィンドウは上部表示のままで、マウスが依然として相互作用と下部ウィンドウできるようにすることを、プロセスを有効にします

外部exeファイルを起動した後、ウィンドウの上部に表示されたexeファイルの外を許可し、そしてマウスは、QQのチャットボックスのようになどの機能「一番のウィンドウを保持」、下とインタラクティブウィンドウになります。最近の機能を実装しました。私たちは、プロセス・ウィンドウ操作にC#を使用する場合、私はまた、この機能を実現するためにはない深い書かれた初期の理解を、それを知っているので、Win32APIのためのWin32 APIインターフェイスを呼び出します。
最後に、物品のスクリプトのための完全なコードがあります:

ここで書き込みについて話すことによって団結の例を示します。

1.新しいスクリプトと新しいシーン、スクリプト最初の呼び出しのAPIの勝利32、およびカスタム属性フィールドを作成します。

  ///   Win32 API 相关代码定义声明  Start

    [DllImport("User32.dll")]//根据句柄名称返回一个句柄
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]//得到上层窗口(活动窗口)
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll", SetLastError = true)]//设置窗口位置
    private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);


    const int HWND_TOPMOST = -1;//让窗口显示在上层
    const int SWP_NOMOVE = 2;//忽略位置设置
    const int SWP_NOSIZE = 1;//忽略大小设置
    const int SWP_SHOWWINDOW = 64;//显示窗口

    ///   Win32 API 相关代码定义声明  end

2、追加のフィールドを定義します。

 	 const string exePath = "要启用的Exe";//exe路径
    //const string exeIntptrName = "句柄名称";//exe进程的句柄名称

    Process pss;//启用的exe进程记录下来

    Thread setTopThread;//管理设置exe窗口置顶的线程

3、exeファイルを指定したプロセスを開始

 //启动exe进程
 pss = Process.Start(exePath);

図4に示すように、上部EXEにスレッド表示ウィンドウは、管理操作を専門ように、スレッドを開き

 	/// <summary>
    /// 开启线程
    /// </summary>
    void StartThread()
    {
        setTopThread = new Thread(new ThreadStart(ExeWindowShowTop));
        setTopThread.Start();
    }

    /// <summary>
    /// 使外部exe窗口一直显示在最上层,需要循环调用
    /// </summary>
    void ExeWindowShowTop()
    {
        //判断该进程是否为空,如果是,则关闭线程,并跳出
        if (pss == null)
        {
            CloseTopThread();
            return;
        }

        ////exe进程的句柄
        //IntPtr exeHwnd = FindWindow(null, exeIntptrName);

        //当前激活的进程句柄
        IntPtr activeWndHwnd = GetForegroundWindow();

        //// 当前程序不是活动窗口,则设置窗口显示在上层
        //if (pss.MainWindowHandle != activeWndHwnd)
        //{
        //    SetWindowPos(pss.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
        //}

  		SetWindowPos(pss.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
        //递归:0.3s后调用该方法,持续检测
        Thread.Sleep(300);
        ExeWindowShowTop();
    }

    /// <summary>
    /// 关闭设置窗口显示在最上层的线程
    /// </summary>
    void CloseTopThread()
    {
        if (setTopThread != null)
        {
            setTopThread.Abort();
            setTopThread = null;
        }
    }

図5は、Startメソッドの開口テストはMonoBehaviourから継承しました

	private void Start()
    {
        //启动exe进程
        pss = Process.Start(exePath);
        //开启管理exe窗口始终显示在最上层的线程
        StartThread();
    }

図6に示すように、追加の指定閉処理方法。

 /// <summary>
    /// 关闭一个进程
    /// </summary>
    /// <param name="processName">进程名称</param>
    void CloseProcess(string processName)
    {
        // // 这是关闭上面记录下来的exe进程代码(已注释)
        //pss.Kill();
        //pss.WaitForExit();


        // 这是根据进程名称关闭指定进程的代码
        Process[] allPss = Process.GetProcesses();
        foreach (Process pss in allPss)
        {
            if (pss.ProcessName == processName)
            {
                pss.Kill();
            }
        }
    }

上記は、対話することができ、上下のウィンドウに表示される進行状況ウィンドウを達成することができるようになります。
付録:スクリプトの完全なコード:

 ///   Win32 API 相关代码定义声明  Start

    [DllImport("User32.dll")]//根据句柄名称返回一个句柄
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]//得到上层窗口(活动窗口)
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll", SetLastError = true)]//设置窗口位置
    private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);


    const int HWND_TOPMOST = -1;//让窗口显示在上层
    const int SWP_NOMOVE = 2;//忽略位置设置
    const int SWP_NOSIZE = 1;//忽略大小设置
    const int SWP_SHOWWINDOW = 64;//显示窗口

    ///   Win32 API 相关代码定义声明  end



    const string exePath = "要启用的Exe";//exe路径
    //const string exeIntptrName = "句柄名称";//exe进程的句柄名称

    Process pss;//启用的exe进程记录下来

    Thread setTopThread;//管理设置exe窗口置顶的线程

    private void Start()
    {
        //启动exe进程
        pss = Process.Start(exePath);
        //开启管理exe窗口始终显示在最上层的线程
        StartThread();
    }

    /// <summary>
    /// 开启线程
    /// </summary>
    void StartThread()
    {
        setTopThread = new Thread(new ThreadStart(ExeWindowShowTop));
        setTopThread.Start();
    }

    /// <summary>
    /// 使外部exe窗口一直显示在最上层,需要循环调用
    /// </summary>
    void ExeWindowShowTop()
    {
        //判断该进程是否为空,如果是,则关闭线程,并跳出
        if (pss == null)
        {
            CloseTopThread();
            return;
        }

        ////exe进程的句柄
        //IntPtr exeHwnd = FindWindow(null, exeIntptrName);

        //当前激活的进程句柄
        IntPtr activeWndHwnd = GetForegroundWindow();

        // 当前程序不是活动窗口,则设置窗口显示在上层
        if (pss.MainWindowHandle != activeWndHwnd)
        {
            SetWindowPos(pss.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
        }

        //递归:0.3s后调用该方法,持续检测
        Thread.Sleep(300);
        ExeWindowShowTop();
    }

    /// <summary>
    /// 关闭设置窗口显示在最上层的线程
    /// </summary>
    void CloseTopThread()
    {
        if (setTopThread != null)
        {
            setTopThread.Abort();
            setTopThread = null;
        }
    }

    /// <summary>
    /// 关闭一个进程
    /// </summary>
    /// <param name="processName">进程名称</param>
    void CloseProcess(string processName)
    {
        // // 这是关闭上面记录下来的exe进程代码(已注释)
        //pss.Kill();
        //pss.WaitForExit();


        // 这是根据进程名称关闭指定进程的代码
        Process[] allPss = Process.GetProcesses();
        foreach (Process pss in allPss)
        {
            if (pss.ProcessName == processName)
            {
                pss.Kill();
            }
        }
    }
公開された14元の記事 ウォンの賞賛0 ビュー414

おすすめ

転載: blog.csdn.net/a0_67/article/details/105067578