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
반응형
'Unity' 카테고리의 다른 글
[Unity] C# 중복 실행 방지 코드 (0) | 2021.06.10 |
---|---|
[Unity] MLAgent Setting 방법 (0) | 2021.06.09 |
[Unity] AR Foundation 물건 배치 (0) | 2021.05.09 |
[Unity] StreamWritter 덮어쓰기/이어쓰기 기록 (0) | 2021.03.24 |
Error building scripts: Data layout for script 'MyScript' has changed. Need to do a complete player export 에러 해결방법 (0) | 2021.03.14 |