UIElement:CaptureMouse

프로그램 개발 중에 요청이 들어 왔는데

ShowDialog 로 창이 표시 된 이후
우클릭 시 창을 닫아 달라는 요청입니다.

Dialog Window에 마우스 이벤트를 추가 했더니
커서가 윈도우 밖으로 나가면 이벤트가 들어 오지 않았습니다.

찾아본 결과 알게 된 것이 CaptureMouse 였습니다.

그래서 다음 코드를 추가 하였는데

public DialogWindow()
{
	InitializeComponent();
	Owner = Application.Current.MainWindow;
	Loaded += (_, _) => System.Diagnostics.Debug.WriteLine(CaptureMouse());
	MouseRightButtonDown += (_, _) => System.Diagnostics.Debug.WriteLine("asd");
}

캡쳐는 true 로 적용 되었고 원하는 MRB는 잘 들어 오는데
제가 받지 않는 모든 이벤트가 먹통입니다.

클릭 드레그 모든 액션이 안됩니다.

직접 받지 않는 이벤트는 어떻게 처리 해야 되나요?

이전에 WinAPI 할때 외부에서 발생한 마우스이벤트 주는 메세지가 있었는데
그걸 wpf 에서는 못쓰는거 같네요.

PS : 이제 spy++ 이 안되나요? 위에 적고 보니 찾아볼까 싶어서 했는데 메세지가 안들어 오네요…;; 너무 오래 되서 사용법을 까먹었나…

2 Likes

더 좋은 방법이 있을지도 모르겠지만, 마우스 전역 후킹을 쓰면 어떨까 싶습니다.

1 Like

그방법 뿐인가 보군요…

1 Like

RawInput을 이용하면 가능할 것입니다.

.NET Framework: 788. RawInput을 이용한 키보드/마우스 입력 모니터링 (sysnet.pe.kr)

단지, Click 처리는 없으므로 Mouse 입력인 경우 Mouse.ButtonFlags의 값으로 RightDown / RightUp을 적절하게 판단해야 합니다.

3 Likes

꼼수지만 Dialog 창을 부모창 크기만큼 띄우고 가운데 패널을 붙이고 버튼을 붙여 마치 메세지 창만 뜬것 처럼 보이게 배경을 투명으로 지정하면 되지 않을까요?? 그러면 활성화된 창 어디에서든 마우스가 있게되니 우클릭이 작동할 것 같습니다~! Dialog 창이 움직여야 한다면 패널에 마우스이벤트 추가하고… ㅎㅎ;;

4 Likes

옴… ReleaseMouseCapture() 를 하셨는지 모르겠네요.

반드시 right button down 에 창이 꺼져야하는 것이 아니라면
right button down 이벤트에서 CaptureMouse() 를 하고 right button up 에서 ReleaseMouseCapture() 해준 다음 DialogWindow 를 close 하면 될 거 같은데요.

아닌가 ㅇㅅㅇ?

혹시 제가 이해를 못한 거라면 죄송…(_ _)

4 Likes

아주 좋은 방법 중 하나 인 것 같습니다. 실제로 Prism DialogService도 이와 같은 방식이고 시각적으로도 현대적이고 트렌디하게 만들 수 있는 장점도 있겠네요.

3 Likes