2009-05-08 6 views
0

ElementHost를 통해 WPF UI를 호스팅하는 WinForms 양식 (MyForm이라고 함)이 있습니다. 기본 UI 스레드와 별도의 스레드에이 양식을 표시합니다.다른 창에서 다른 창 위에 창을 유지하는 방법은 무엇입니까?

'MyForm'을 주 응용 프로그램 창 위에두기를 원하므로 전달 된 IWin32Window가 주 응용 프로그램 창인 Show 메서드의 Show (IWin32Window) 오버로드를 사용하여 양식을 표시하고 있습니다.

이 창은 별도의 STA 스레드 (Application.Run으로 전달 된)의 '응용 프로그램 양식'인 '실행 프로그램 양식'을 통해 간접적으로 표시됩니다. 그 이유는 Application.Run을 통해 양식을 시작할 때 소유자 윈도우를 지정할 수 없기 때문입니다.

void MyWindowThread() 
{ 
    myForm = new MyForm(); 
    var launcherForm = new LauncherForm(myForm, mainWindow); 
    Application.Run(new ApplicationContext(launcherForm)); 
    // launcherForm will Show myForm when it itself is shown. 
} 

'실행'형태 :이 거의 작동

public partial class LauncherForm : Form 
{ 
    private readonly MyForm _myForm; 
    private readonly IWin32Window _mainWindow; 

    public WizardUILauncherForm(MyForm myForm, IWin32Window mainWindow) 
    { 
    _myForm = myForm; 
    _mainWindow = mainWindow; 
    InitializeComponent(); 
    } 

    protected override void OnShown(EventArgs e) 
    { 
    // show the actual form that the user will interact with, on top of mainWindow. 
    _myForm.Show(_mainWindow); 
    } 
} 

여기

은 (AN STA 스레드의 ThreadStart으로 사용)을 MyForm을 실행하는 코드이다. 'MyForm'은 주 앱 윈도우 상단에 있지만 툴팁이있는 WPF 컨트롤 위에 마우스를 올려 놓기 전까지 만 유지됩니다. 툴팁이 표시되면 'MyForm'이 주 응용 프로그램 창 뒤에 표시됩니다. WinForms 컨트롤을 폼에 마우스 포인터를 올려 놓으면 툴팁이 표시됩니다. WPF 컨트롤에만 적용됩니다.

MyForm이 전경 창일 때만 발생합니다.

MyForm을 응용 프로그램 양식 (시작 관리자를 건너 뛰기)으로 사용하고 SetWindowLong을 사용하여 해당 소유자를 설정하는 MyForm의 OnLoad 메서드를 재정의 할 때도 동일한 문제가 발생합니다. 이것은 덜 복잡한 방법이지만 P-Invoke를 사용하지 않는 메커니즘을 사용하여 이것이 더 잘 작동하는지 확인하고자했습니다. 두 방법 모두 같은 방식으로 손상됩니다.

업데이트 테스트 응용 프로그램은이 문제가 Visual Studio 마법사 확장에서 UI를 표시하는 경우에만 발생 함을 나타냅니다. 내가 생각하기에 그것은 더 많은 틈새 시장으로 만들고 심지어 대답하기가 쉽지 않습니다!

답변

0

다음 MSDN 기사는 WinAPI 호출에 대한 내용이지만 다른 스레드 간의 창 활성화에 대한 약간의 통찰력을 제공 할 것입니다. WinAPI에 P/Invoke를 직접 수행해야한다고 가정합니다. 쓰레드) :

Multiple Threads in the User Interface

(특히창 포커스 섹션 및 활성화 고려 사항을 참조하십시오)

관련 문제