2011-03-18 2 views
2

이 게시물의 제목에서 모았을 것이므로 나는 약해 보려합니다.WinForms Control MouseDown 이벤트에 대한 응답으로 WPF, WinForms, ActiveX 컨트롤 및 내 소멸 성 (DragMove() 호출)

자, 여기 있습니다. ActiveX 컨트롤을 호스팅하는 WinForms Form을 호스트하는 WPF 창이 있습니다. 이는 모두 레거시 구성 요소 및 투명한 WPF 창의 불투명도에 애니메이션을 적용하려는 경우입니다. 당신은 이미 재미를 느낄 수 없다?!

... 그래서, 마우스의 DragMove를 창의 다양한 영역에 대해 호출하여 투명 WPF 창을 드래그 할 수있게하고 싶습니다. 이 잘 작동하고 현재 동작을 살 수 있지만 또한 내 WinForms 구성 요소에 의해 생성 된 MouseDown 이벤트를 통해 창을 끌 수 있으면 좋을 것입니다.

void Init() 
{ 
    MyWinForm form = new MyWinForm(); 
    form.SomeControl.MouseDown = form_MouseDown; 
} 

void form_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Left) 
    { 
     DragMove(); 
    } 
} 

그러나, 다음과 같은 메시지가 내 응용 프로그램 충돌 : 기본 마우스 버튼이 눌러져있을 때

만 DragMove를 호출 할 수 있도록, 나는 명백한 착수했습니다.

그래, 왼쪽, 오른쪽, (주) 버튼을 제외한 (나는이 왼쪽 손으로 마우스를 올리면 문제가 될 수 실현,하지만의 지금은이를 방지 할) 버튼을 누르면되고입니다. 따라서 WPF 컨트롤로 생성 된 Mouse 이벤트에 대해 작동하는 간단한 코드가 System.Windows.Forms.Control에 대해 실패합니다. 누구나이 경험이 있습니까? 제공 할 수있는 조언에 대해 미리 감사드립니다.

TLDR; DragMove()System.Windows.Controls.MouseDown 이벤트 내부에서 호출하면 앱이 다운됩니다. 이 시점에서 해결 방법을 사용할 수 있습니다. 우리가 작성하거나 버튼 상태 검사를 수행하지 않는 DragMove(IntPtr hWnd)을 소유 할 수 있지만, 우리는 명시 적으로 MouseDown 이벤트 처리기에서 마우스 캡처를 해제해야합니다 : 반사판을 사용하여 DragMove() 코드를 보면

답변

2

, 나는이 솔루션에 왔어요.

public static class Utility 
{ 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr h, int msg, IntPtr lp, IntPtr wp); 

    public static void DragMove(IntPtr hwnd) 
    { 
     const int WM_SYSCOMMAND = 0x112; 
     const int WM_LBUTTONUP = 0x202; 

     SendMessage(hwnd, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero); 
     SendMessage(hwnd, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero); 
    } 
} 

하고 이는 MouseDown 핸들러에게 조금 변경 :

void form_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Left) 
    { 
     // it is necessary to release mouse capture, so that 
     // WPF window will be able to capture mouse input 
     ((Control)sender).Capture = false; 
     // use helper to acquire window handle 
     var helper = new System.Windows.Interop.WindowInteropHelper(
      your_window_reference_goes_here); 
     Utility.DragMove(helper.Handle); 
    } 
} 

내가 ActiveX 컨트롤로 테스트하지 않았다, 그러나 적어도 Win7에 궁극적 인 x64에 WindowsFormsControlHost에서 호스팅, 간단한 윈폼 컨트롤 작동을 .

+0

왜 항상 반사경을 잊어 버리는 것 같습니까? ... 어쨌든, 선생님은 매우 도움이되었습니다. 고마워, 그것은 위대한 작품과 새로운 뭔가 가르쳐. 건배. –

관련 문제