을 얻을 수 있습니의 동작을 설정 내 WinForms 양식의 소유자가 사용하는 hwnd/윈도우?

StackOverflow https://stackoverflow.com/questions/213661

  •  03-07-2019
  •  | 
  •  

문제

내 응용 프로그램은 vb6 실행하지만,일부 새로운 형태에서 시스템은 C#으로 작성되어 있습니다.하고 싶을 설정할 수 있 C#양식의 소유자산을 사용하여 처리의 주요 응용 프로그램에서는 대화 상자의 상단에 남아 있을 때 누르 사이에 앞뒤로 내 응용 프로그램을 적용합니다.

를 얻을 수 있습 hwnd 의 주요 응용 프로그램 창을 엽니다.나는 확실하지 않다 무엇을 할 수 있나요?


업데이트 Oct20'08 17:06:

Scott,

감사에 대한 반응이다.했다 간과하는 것 표시/ShowDialog 방법을 매개 변수가지 유형의 양식을 찾고 있었에서만 소유자가 제공합니다.

나는 약간 수정 코드가 나를 사용하여 위에서 우리는 구성요소는 일반적으로 우리의 형태 및 통화 ShowDialog.내 코드는 다음과 같습니다:

Form launchTarget = FormFactory.GetForm(xxx);  // psuedo-code for generic form loader
launchTarget.StartPosition = FormStartPosition.CenterParent;
IWin32Window parentWindow = GetWindowFromHwnd(hwnd);

launchTarget.ShowDialog(parentWindow);

GetWindowFromHwnd 는 방법을 감싸 버전의의 코드:

private IWin32Window GetWindowFromHost(int hwnd)
{
    IWin32Window window = null;
    IntPtr handle = new IntPtr(hwnd);

    try
    {
        NativeWindow nativeWindow = new NativeWindow();
        nativeWindow.AssignHandle(handle);
        window = nativeWindow;
    }
    finally
    {
        handle = IntPtr.Zero;
    }

    return window;
}

불행하게도 이 일을 하지 않습니다 어떤 나는 희망했다.의 양식을 표시한 모달로,그러나 그것은 아주 올바른 위치 도 아니다 그것은 여전히 하면 위에 나는 탭을 멀리하고 다시 부모 window.우리의 조동사를 표시하지 않는 작업이 작업 표시줄에서,그래서 창 겉으로는"사라"(지만 그것은 여전히 존재에 alt-탭 창 목록).는 나에게 나타내지 않을 수도 권리가 있 hwnd.는 경우 다른 어떤 제안을 하지만,다시 회신 해 주시기 바랍니다.다시 한번 감사드립니다.


업데이트 Nov10'08 16:25

중 하나를 따라 말-당신은 당신의 요소로 그것을 밖으로 메소드 호출에 시도/마지막으로,스 2nd 게시,통화에서 마지막으로 차단되어야:

parentWindow.ReleaseHandle();
도움이 되었습니까?

해결책

그래서 당신은 vb6에서 c# windows 양식 클래스를 호출하고 있습니다. Show() 또는 ShowDialog(), 옳은? 이 두 가지 방법 모두 IWIN32WINDOW 매개 변수를 사용하여 핸들이라는 INTPTR 속성을 반환하는 객체를 정의합니다.

그래서 ... 당신은 당신의 Windows Forms 클래스에 과부하 된 생성자 (또는 showdialog 메소드)를 추가해야합니다. long 매개 변수로서 VB6 HWND를 양식으로 전달할 수 있습니다. C# 코드에 들어가면 hwnd에서 intptr을 만들어 다음에 할당해야합니다. NativeWindow 반대하고 소유자로 전달하십시오.

이 같은 ~해야 한다 테스트되지 않았지만 작업 :

public DialogResult ShowDialog(long hwnd)
{
   IntPtr handle = new IntPtr(hwnd);
   try
   {
      NativeWindow nativeWindow = new NativeWindow();

      nativeWindow.AssignHandle(handle);
      return this.ShowDialog(nativeWindow);
   }
   finally
   {
      handle = IntPtr.Zero;
   }
}

다른 팁

이것은 너무 길어로 게시물에 댓글...

나는 생각한 문제가 당신은에서 실행하는 방법 당신은 당신을 감싸 코드 내에서 제시 ShowDialog 과부하 있습니다.는 경우에 당신은 무엇을 따라하 GetWindowFromHost 코드는 그 일을 다음 단계를 진행한다:

  1. 새로 만듭 IntPtr 에서 hwnd 주어집니다.
  2. 새로 만들어 윈도우 객체를 할당합니다 그것은 처리할 IntPtr.
  3. 트 IntPtr(에서 마지막으로 블록)를 IntPtr.니다.

나는 그것이 마지막으로 블록을 일으키는 문제입니다.내 코드,마지막으로 차단 실행 후 전화 this.ShowDialog(nativeWindow) 완료.해당 지점에서 핸들(IntPtr)더 이상 사용되고 있습니다.코드에서는 반환하는 IWin32Window 는 아직도 해야에 대한 참조는 IntPtr 는 시간에 당신은 전화 launchTarget.ShowDialog(parentWindow) 은 IntPtr.니다.

도 변경하는 코드를 다음과 같이:

private NativeWindow GetWindowFromHost(int hwnd)
{
   IntPtr handle = new IntPtr(hwnd);
   NativeWindow nativeWindow = new NativeWindow();
   nativeWindow.AssignHandle(handle);
   return window;
}

한 다음 변경의 부르는 코드는 다음과 같이:

Form launchTarget = FormFactory.GetForm(xxx);  // psuedo-code for generic form 
loaderlaunchTarget.StartPosition = FormStartPosition.CenterParent;
NativeWindow parentWindow = GetWindowFromHwnd(hwnd);

try
{
   launchTarget.ShowDialog(parentWindow);
}
finally
{
   parentWindow.DestroyHandle();
}

이러한 변경 내용해 작동하지만 이것은 검증되지 않은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top