2010-01-25 4 views
-1

HwndSource 클래스를 사용하여 C++/CLI 응용 프로그램에서 WPF 컨트롤을로드하려고합니다.C++/CLI : Interop 창이 제대로 구성되지 않았습니다.

IntPtr MyWindowWrapper::MessageHookFunction(IntPtr HWnd, int Msg, 
     IntPtr WParam, IntPtr LParam, bool% OutHandled) { 
    IntPtr Result = (IntPtr)0; 
    OutHandled = false; 

    if(Msg == WM_GETDLGCODE) { 
     OutHandled = true; 

     // This tells Windows that we'll need keyboard events for this control 
     Result = IntPtr(DLGC_WANTALLKEYS | DLGC_WANTCHARS | DLGC_WANTMESSAGE); 
    } 
    return Result; 
} 

그리고 여기 내 문제가 있습니다 : 그래서 (

  • 창 제목이 비어있는 키보드 이벤트 창에 전달되도록

    UBOOL MyWindowWrapper::Init(const HWND InParentWindowHandle) { 
        Interop::HwndSourceParameters sourceParams("WindowName"); 
        sourceParams.PositionX = 0; 
        sourceParams.PositionY = 0; 
        sourceParams.ParentWindow = (IntPtr)InParentWindowHandle; 
        sourceParams.WindowStyle = (WS_VISIBLE | WS_CHILD); 
        sourceParams.HwndSourceHook = nullptr; 
    
        InteropWindow = gcnew Interop::HwndSource(sourceParams); 
    
        Control = gcnew MyWPFUserControl(); 
        InteropWindow->RootVisual = Control; 
    
        InteropWindow->AddHook(gcnew Interop::HwndSourceHook(
         this, &MyWindowWrapper::MessageHookFunction)); 
        return TRUE; 
    } 
    

    는 그리고는 후크 함수를 정의 "WindowName"매개 변수는 고려되지 않음)

  • 일부 키보드 이벤트 만 전송됩니다 : 공간, 제어, 화살표는 괜찮지 만 문자를 입력 할 수는 없습니다 모든 텍스트 상자에

내가 뭘 잘못하고 있니?

답변

0

빈 제목에 대해서는 HwndSource 창의 이름이 창 제목과 아무 관련이 없기 때문입니다. 위에 작성된 코드 HwndSource 창이 InParentWindowHandle으로 표시된 창의 하위입니다. 텍스트가 제목 표시 줄에 사용되는 것은이 창입니다. 창의 제목을 설정하려면 HWND을 사용하여 SetWindowText()으로 전화해야합니다.

타이핑 문제에 대해서는 후크를 추가해야합니까? WPF/Win32 통합을 사용하여 작은 테스트 응용 프로그램을 만들었지 만, WPF 컨트롤이 모든 키보드 입력을 수신했는지 확인하기 위해 특별한 작업을 수행하지 않아도됩니다.

+0

나는 실제로 새로운 빈 프로젝트로 몇 가지 테스트를 만들었고 키보드 이벤트는 후크없이 전송된다. 그래서 그것은 다른 곳에서 왔을 것입니다 ... 어쩌면 WxWidgets에서 온 것일 수도 있습니다. 제목에 대해서는 예, 테스트 프로젝트에서 HwndSource가 Hwnd 창의 하위 노드로 연결되어있는 것을 보았습니다. 반면에 주 프로젝트에는 완전히 새로운 창이 생성되었습니다. 그래서 HwndSource를 첨부하면 자동으로 윈도우가 생성되는 것 같습니다. 이유는 모르겠습니다. 답장을 보내 주셔서 감사합니다. – user258607

+0

HwndSource는 항상 새 창을 만듭니다. – Andy

0

known incompatibility in WPF interop within a native, modal dialogue이 있습니다.

요약하기 : 그들은 당신의 컨트롤에 도착하기 전에

인해 구현 세부 사항에, WM_CHAR 메시지가 IsDialogMessage() 기능에 모달 대화 상자의 메시지 펌프에 의해 삼켜된다. 당신은 후크 기능에서 WM_GETDLGCODE을 처리하고 DLGC_WANTCHARS을 반환함으로써 자신을 강제로 검색 할 수 있습니다.

관련 문제