Unity

[Unity] Unity Window Build 파일 SetFocus()/SetForeGround()하기

Guk-blog 2021. 6. 8. 16:55
728x90
반응형

빌드 된 실행파일을 자동시작했는데 포커스가 실행파일에 없으면

인풋이 안들어가는 상황이 발생하는데

의뢰인이 조작없이 알아서 바로 인풋이 가능하도록 요청하면서 만든 프로그램

 

일단 유니티로 해결하려면 Run In Background 옵션을 키시면 됩니다.

 

저는 위 옵션을 사용하지 않으려고

C#프로젝트를 하나 새로 생성후 

아래의 코드를 붙여넣습니다

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace UnityAutoFocusEXE
{
    class Program
    {
        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
        private const int SW_SHOWNORMAL = 1;
        private const int SW_SHOWMINIMIZED = 2;
        private const int SW_SHOWMAXIMIZED = 3;
        [DllImport("user32.dll")]
        static extern int GetForegroundWindow();
        [DllImport("user32.dll")]
        static extern bool SetForegroundWindow(IntPtr hWnd);
        [DllImport("user32.dll")]
        static extern bool SetFocus(IntPtr hWnd);
        [DllImport("user32.dll")]
        static extern bool AllowSetForegroundWindow(int dwProcessId);


        static void ActivateApp()
        {
            Process[] p = Process.GetProcessesByName("유니티 프로세스 이름");
                // Activate the first application we find with this name
                if (p.Length > 0)
                {
                    try
                    {
                        ShowWindowAsync(p[0].MainWindowHandle, SW_SHOWNORMAL);
                        AllowSetForegroundWindow(p[0].Id);
                        SetForegroundWindow(p[0].MainWindowHandle);
                        SetFocus(p[0].MainWindowHandle);
                    }
                    catch (Exception ex)
                    {
                        Debug.Print(ex.Message);
                    }
                }
        }

        static void Main(string[] args)
        {
            ActivateApp();
        }
    }
}

그리고 Process.GetProcessesByName("유니티 프로세스 이름")에서 ""안에 포커스를 시킬 프로세스 이름을 .exe를 제외한채 적어줍니다

 

그리고 Debug를 Release로 바꾼 후 빌드하면 bin폴더에 exe 파일이 생성되고 이 프로그램을 실행하면 내 실행 프로그램이 딱 올라오면서 포커싱되는 것을 볼 수 있습니다 ㅎㅎ

 

만약 윈도우 스케줄로 유니티 실행 파일을 시작하신다면 마찬가지로 이 파일을 스케줄에 등록하시거나

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
//바탕화면
 
Process.Start(path + "/AutoFocus.exe");

식으로 실행하시면 됩니다.

 

모두 즐거운 개발되시길

728x90
반응형