Custom URI 를 만들어 웹페이지에서 내 PC에 있는 exe 파일을 실행시키는 방법입니다.
아래와 같이 작동 됩니다.


(주의 사항이 하나 있는데 위와 같이 변환 된 결과를 보면 웹 url에서 특수 문자가 다르게 취급됩니다.
UTF-8 과 System.Net.WebUtilty.UrlDecode 기능을 잘 섞어서 필요한 내용으로 만들어주면 되겠습니다.)
먼저 레지스트리에 해당 파일을 실행할 수 있도록 등록해주어야 합니다.
exe파일 실행 시 Main(string[] args) 부분에 대한 처리가 필요합니다.
차근차근 해봅시다.
1. 윈도우키 + R을 눌러 "실행" 창을 띄워줍니다. (혹은 시작->실행 검색)
2. regedit 입력을 해줍니다.

3. HKEY_CLASSES_ROOT 오른쪽 클릭 후 새로 만들기 -> 키 를 선택해줍니다.
이름은 "Test"로 설정해주겠습니다.

4. 아래와 같이 키를 생성해줍니다.
Test에서 shell, shell 에서 open, open 에서 command까지 생성해줍니다.

5. Test 에서 새로 만들기 -> 문자열 값 을 통해 새 값을 만들어줍니다.
해당 값의 이름을 URL Protocol 로 바꿔줍니다.

6. 이번엔 command 쪽의 기본 값을 수정해줍니다. (기본 값을 더블 클릭 해줍니다.)
아래와 같이 문자열 편집이 뜹니다. exe파일의 경로가 되겠습니다.
"C:\Test\test.exe" "%1"
C드라이브 테스트 폴더의 test.exe 실행을 하고, %1은 실행 시 매개변수 값을 하나 줄 수 있다는 의미입니다.

7. 비주얼 스튜디오에서 다음과 같은 코드를 작성하고 exe 파일을 생성합니다.
using System;
namespace ConsoleApp5
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("받아 온 값");
if (args.Length > 0)
{
Console.WriteLine(args[0]); //받아온 값을 보여줍니다.
}
Console.ReadLine(); //값을 보기 위해 대기
}
}
}
8. 해당 파일을 C:\Test\Test.exe 로 옮겨줍시다.

9. 웹에서 실행합니다. 간단하게 url 창에서 실행해보겠습니다.
test://hihi ook
원하는 값을 입력해줍니다. 그리고 엔터를 치면

10. 짜잔 실행이 됩니다.
저 띄어쓰기 부분은 %20 으로 나오고 맨 마지막에도 / 가 자동으로 붙게 됩니다.
우선 간단하게 값을 받아오고 실행에 성공을 하였습니다.

설명이 너무 길어져서 나머지는 예제 파일로 남겨두겠습니다.
비주일 스튜디오 2019로 작업한 파일과 레지스트리 생성, test.exe 파일이 들어있습니다.
웹에서 어떻게 호출하는지와 C#에서 값을 어떻게 받아오는지도 있으니 필요하면 확인해보시길!
코드 정리도 따로 올립니다.
html 코드
[파일명]
custom uri.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function play ()
{
let id = document.getElementById("ID").value;
let pw = document.getElementById("PW").value;
let url = "Test://" + id + "&" + pw + "&"; // 레지스트리에 등록 된 Test:// 호출 부분입니다.
//마지막에 &를 추가해줬는데 끝 부분에 / 와 같은 문자가 붙을 수 있어 경계 탐지용으로..
let exec = document.createElement("a");
exec.setAttribute("href", url);
exec.click();
}
</script>
</head>
<body>
<div> 아이디 <input id="ID" type="text" value="testID!@"></div>
<div> 비밀번호 <input id="PW" type="text" value="!@#$%^&*()"></div>
<div> <button id="call" onclick="play()"> 실행 </button> </div>
</body>
</html>
WindowsForm
[Program.cs]
using System;
using System.Windows.Forms;
namespace Custom_uri_Example
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (args.Length > 0) //외부 호출하여 인자값이 있는 경우
{
Application.Run(new Form1(args));
}
else //바로 .exe 실행
{
Application.Run(new Form1());
}
}
}
}
[Form1.cs]
using System.Windows.Forms;
namespace Custom_uri_Example
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Form1(string[] args) : this()
{
textBox_all.Text = args[0];
string data = args[0].Replace("test://", ""); //앞에 불필요한 문자열은 지워줍니다.
string[] separate = data.Split('&'); //사전에 약속 된 구분자로 나눠줍니다.
string utf_id = separate[0];
string utf_pw = separate[1];
textBox_utf_id.Text = utf_id;
textBox_utf_pw.Text = utf_pw;
//웹에서 받아온 문자 중 특수문자가 다른 경우가 있을 때 WebUtility를 사용해줍니다.
//System.Net 사용이 안되면 참조 추가에서 System.Net을 추가해주면 됩니다.
string web_id = System.Net.WebUtility.UrlDecode(separate[0]);
string web_pw = System.Net.WebUtility.UrlDecode(separate[1]);
textBox_web_id.Text = web_id;
textBox_web_pw.Text = web_pw;
}
}
}
'C# > Windows Form' 카테고리의 다른 글
[C# Windows Form] 로그 남기는 방법 (DateTime, 컴파일 서비스 CallerMember, CallerFilePath, CallerLineNumber) (0) | 2022.11.26 |
---|---|
[C# Windows Form] Alt + Tab, Ctrl + Esc 등 특수 키 막기 (키보드 후킹) (0) | 2022.11.22 |
[C# Windows Form] FormBorderStyle = None 인 경우 모니터 위치에 맞게 최대화 시키기 (0) | 2022.07.26 |
[C# Windows Form] ListView 기본 사용법 (1) 컬럼 및 아이템 (0) | 2022.06.15 |
[C# Windows Form] 이미지 회전 시키기 (Image, Graphics) (0) | 2022.05.05 |