을 얻을 수 있습니의 동작을 설정 내 WinForms 양식의 소유자가 사용하는 hwnd/윈도우?
문제
내 응용 프로그램은 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
코드는 그 일을 다음 단계를 진행한다:
- 새로 만듭 IntPtr 에서 hwnd 주어집니다.
- 새로 만들어 윈도우 객체를 할당합니다 그것은 처리할 IntPtr.
- 트 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();
}
이러한 변경 내용해 작동하지만 이것은 검증되지 않은.