WinForm 과 Unity Web Player 의 TCP 연결에 대한 정보를 찾던 도중 우연찮게 발견한 정보를 번역하여 올려봅니다.

하나도 모르는 중국어와 갓구글의 번역을 이용하여 보기편하게 번역을 한거므로 다소 미흡할수도 있으니 참고하는 용도로 보시기 바랍니다.

(오역이나 잘못된 번역은 댓글로 알려주시기 바랍니다.)


시작하기 앞서.....

이 프로젝트는 CodeProject 에서 본 글을 토대로 재설계하여 다른 응용프로그램의 내장된 제어 기능을 갖춘 라이브러리를 사용하였다.

http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project


위 사진에서 보듯이 Adobe Reader를 열고 "프로그램에 내장 프로그램의 창 활성화 문제를 호스트" 내장 프로그램 윈도우가 활성화 될 때, 숙주 윈도우가 비활성 상태에 싸서 직면하게되었다. 이것을 해결하려고, FormBorederStyle 속성을 None 시키고 종료 극대화 뿐만 아니라 버튼을 최소화하기 위해 창에 그려진다. (먼말인지 ㅠㅠ)

아이디어 실현을 위해 저자가 노력하였다. 그래서 여기에 저자의 코드 구현과정을 설명합니다.

(저자란, 위 링크의 글쓴이를 말하는거 같다.)

1. 응용 프로그램 프로세스를 시작하는 것이 포함된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Process p = null
try 
{
  // Start the process 
  p = System.Diagnostics.Process.Start(this.exeName); 
 
  // Wait for process to be created and enter idle condition 
  p.WaitForInputIdle(); 
 
  // Get the main handle
  appWin = p.MainWindowHandle; 
catch (Exception ex) 
  MessageBox.Show(this, ex.Message, "Error"); 
}
cs

2. 사용자 지정 컨트롤에 포함 된 응용 프로그램 창을 시작합니다 윈도우 API를 호출(저자는 패널 컨트롤을 사용)


1
2
3
4
5
6
7
8
// Put it into this form
SetParent(appWin, this.Handle);//this在这里是Panel控件
 
// Remove border and whatnot
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
 
// Move the window to overlay it on this window
MoveWindow(appWin, 00this.Width, this.Height, true);
cs

3. 내장 폼의 설정은 호스트 폼 형태의 크기 변화에 맞쳐 변화한다.


1
2
3
4
5
6
7
8
protected override void OnResize(EventArgs e)
{
  if (this.appWin != IntPtr.Zero)
  {
    MoveWindow(appWin, 00this.Width, this.Height, true);
  }
  base.OnResize (e);
}
cs

4. 호스트 프로그램이 종료될때의 처리


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected override void OnHandleDestroyed(EventArgs e)
{
  // Stop the application
  if (appWin != IntPtr.Zero)
  {
    // Post a colse message
    PostMessage(appWin, WM_CLOSE, 00);
 
    // Delay for it to get the message
    System.Threading.Thread.Sleep(1000);
 
    // Clear internal handle
    appWin = IntPtr.Zero;
  }
  base.OnHandleDestroyed (e);
}
cs

코드의 원래 저자는 실제로는 불편 사용, 특히 우리는 알고 시도, 정교하지 않습니다. (어쨋든, 나는 저자의 라이브러리를 까는게 아니고 위의 단계에서 배울수 있는것은 배웠다.)

나는 위의 단계를 매우 사용하기 편하고 실용적인 컨트롤을 개발하였다.

가장 먼저, 솔루션 탐색기에 위치한 자신의 프로젝트에 참조라이브러리 SmileWei.EmbeddedApp 을 추가한다. ( 글 밑에 있는 소스파일에서 라이브러리를 꺼내와야한다.)


두번째, 호스트 폼에 AppContainer 컨트롤을 드래그하여 좋은 위치에 배치한다. 


세번째, AppContainer 컨트롤에게 응용 프로그램을 포함하려면(*.exe 파일) 절대경로가 있어야한다.(나는 OpenFileDialg 를 사용) , AppContainer 제어 명령을 시작합니다.

1
2
appContainer1.AppFilename = openEXE.FileName;
appContainer1.Start();
cs

이 AppContainer 제어는 좋은것입니까?

1. 저자의 생각(종료에 관한 고민)인 호스트 프로그램이 닫히고 닫힌 문제 및 크기 조정을 AppContainer 는 해결해줬다.

2. AppContainer 는 임베디드 어플리케이션을 지정하고 더 유연하게 시작, 분리됩니다. 다음과 같이 개발 과정은 결과을 볼 수 없습니다. : 내장 된 프로그램에 와서 "情不自禁"의 컨트롤의 원래 저자을 개발할 때 로드됩니다. (情不自禁 은 도움이되지 수 라는데 먼 소리인지...)

3. AppContainer 가능한 오류 상황을 방지하려면, 예를 들어 금지 자체는 자신을 포함(고리 死循环) , 프로그램이 프롬로프 할 때 당신은 인라인 콘솔을 포함 할 수 없습니다. 매개 변수가 null 또는 무효 검사입니다.

4. 기타. 예를 들어, AppContainer 는 Thread.sleep(1000); 를 사용하지 않으며, 사용할 경우 문장의 로우 엔드가 (그리고 또한 이 프로그램을 실행할 때 포토샵처럼 매우 느린 실행이 될 수 있다.) 이 임베디드 기술을 형성하지만 그 전에 포함 된 프로그램에서 달성된 후 Application.llde 이벤트에 의해 로드됩니다.

 물론, 일부 애플리케이션은 매우 자동화 되어 호스트 폼에 내장 될 수 없다. 프로그램이 시작되고, 메인 윈도우 핸들 형태가 같지 않기 때문에 AppContainer 메인 윈도우 핸들을 얻을 수 없으며, 자동으로 포함 할 수 없습니다.

이 문제를 해결하기 위해, 나는, 호스트의 상태 표시 줄의 형태로 "핸들 임베디드"태그를 설정, "임베디드 핸들" 을 클릭, 그런 다음 호스트의 형태를 포함 할 수 있습니다. 응용 프로그램의 주 창 핸들을 포함 하여 채울 수 있습니다.

그런 다음 학생들이 묻는, 어떻게 당신이 창 핸들을 포함 하는것을 알고 얼마나 알수있습니까? 여러 가지 방법이 있다. 내가 여기에 핸들을 생산하는 작은 프로그램을 있으며, 당신은 그것을 여기에서 다운로드 할 수 있다. :

WindowDetective(窗口侦探)0.20.rar

인터페이스는 다음과 같습니다 :

내부 " 핸들 : {1903014}" 자신을 메인 창 핸들을 제공하는 라인은 윈도우 라이브 라이터에 사용된다.

사용법은, 프로그램을 실행하면 자동으로 화면에 표시가 되며 마우스 위치의 표시 정보가 매우 간단히 검출된다. 그래서 당신은 폼의 마우스 위치를 확인하고 싶다면 메뉴 표시 줄을 클릭하면 된다.

내 소스 코드, 변수 이름은 표준이고 이해하기 쉬운 명시적 주석, 형을 제공합니다. 더 많은 것을 설명하기 위해 질문은 매세지로 남겨주세요. (저에게도 남겨주시면 최대한 답변 해드리겠습니다....)

본 논문에서의 모든 소스코드, 실행 프로그램을 다운로드하려면 아래에서 확인할 수 있습니다.

SmileWei.EmbeddedApp20150201.rar

2015년 5월 4일 이후의 최신 소스코드는 옆 링크에서 확인가능하다.  https://github.com/bitzhuwei/AppContainer

나는 포함 된 영향에 대해이 속성을 보여, 앱 FormBorderStyle 다양한 예제를 추가했습니다.



부족한 지식과 까막눈인 중국어 실력을 가지고 어쭙잖게 번역을 해보았습니다... (중국어 어순이 반대라는 것을 까먹고 작성하여 매우 어색하다..)

이 글은 여기서 끝이고, 자세한 내용 확인과 본 저자에게 질문을 하고 싶다면

http://www.cnblogs.com/bitzhuwei/archive/2012/05/24/smilewei_embeddedapp.html

위 링크로 가셔서 확인, 질문 하시면됩니다.

감사합니다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기