2013-04-02 4 views
0

winforms 응용 프로그램의 모든 컨트롤에 마우스를 가져 가면 효과를 사용할 수 없게하는 방법이 있습니까? 모든 컨트롤을 반복하여 수행 할 수 있음을 알고 있지만 응용 프로그램 수준에서 수행합니다.응용 프로그램에 마우스 이동 효과 사용 안 함

배경이 전체 응용 프로그램에 대한 입력을 비활성화하려는 것입니다 (나는 IMessageFilter을 통해 수행했습니다). 사용자는 마우스를 움직일 수는 있지만 클릭 할 수는 없어야합니다. 이것은 완벽하게 정상적으로 작동하지만 컨트롤 위에 마우스를 가져 가면 효과가 유지됩니다.


편집 :은 버튼 위에 마우스를 이동하는 경우 예를 들어

, 그것은 개방 가능한 여러 구성되어 마우스가 컨트롤

응용 프로그램을 통해 일단 당신이 그것을 클릭 할 수 있음을 나타냅니다 폼은 각각 내가 어플리케이션 동작을 제어 할 필요가있는 backgroundworker (스레드)를 시작할 수 있습니다. 그래서 나는 GUI 스레드 문제로 얽매이지 않는 것을 정말 좋아합니다.

+0

당신이 뜻하는 일을 "효과를 가져 "? –

+0

링크가 도움이 될 것 같아요> http://stackoverflow.com/questions/2698673/disabling-mouse-movement-and-clicks-altogether-in-c-sharp – zey

+0

@zey 이미 마우스 클릭을 사용 중지했습니다. 그리고 IMessageFilter 키보드 입력, 그냥 "호버"효과를 없애려고합니다 – derape

답변

0

당신이 단순히 톱 레벨 윈도우를 사용하지 않을 것을 나에게 보인다. 이렇게하면 모든 문제가 해결되고 IMessageFilter 코드가 필요하지 않습니다. 결국 극소수의 코드로 끝납니다. 당신은 다음과 같은 양식의 가용성을 제어 할 수 있습니다

[DllImport("user32.dll")] 
static extern bool EnableWindow(IntPtr hWnd, bool bEnable); 

: 당신은 P 필요

이/USER32에서 EnableWindow API 호출 호출

EnableWindow(MyForm.Handle, false); // disable form 
EnableWindow(MyForm.Handle, true); // enable form 
+0

고마워, 저도 그걸 가지고 놀았지만 문제는 내 응용 프로그램이 여러 양식을 처리하고 여러 스레드에서 en/disable을 필요로한다는 것입니다. 그래서 모든 폼을 추적해야하고 모든 폼 핸들을 얻기 위해'Invoke'를해야합니다. 어떤 종류의 겁이나요. 가능하다면 GUI 스레드 문제가되고 싶지 않습니다. – derape

+0

이러한 문제는 다음과 같이 구분됩니다. 응용 프로그램을 광범위하게 변경해야하기 때문에 어떤 문제가 있더라도 이러한 문제를 처리해야합니다. –

+0

마우스/키보드 비활성화에 대해서는 (적어도 개발자 입장에서는) 필요하지 않습니다. IMessageFilter 구현의 인스턴스를 내 애플리케이션 메시지 필터 인'Application.AddMessageFilter()'에 추가하면된다. 나는 "호버"효과에 대해서도 이와 같은 해결책이 있기를 바랬습니다 ... 어떻게 든 커서를 조작하면 ... – derape

0

당신은 당신의 자신의 버튼 클래스를 만드는 시작하고 MouseEnter 이벤트를 발생 덮어 쓸 수 있습니다 :

protected override void OnMouseEnter(EventArgs e) 
{ 
    if (shouldBeEnabled) 
    { 
     base.OnMouseEnter(e); 
    } 
} 
+0

버튼을 원하지만 그 이벤트에 마우스를 처리 할 수있는 모든 컨트롤에 대해 말하지 않습니다 – derape

+0

승인. 나는 당신이 모든 수업을 직접 만들고 싶지 않다고 생각합니다. 그래서 여기가 가장 쉬운 방법입니다. 폼의 OnLoad 메서드에서 모든 자식 컨트롤을 반복하고 OnMouseEnter 이벤트를 제거하고 사용자 지정 컨트롤을 추가합니다. 사용중인 모든 UI 컨트롤에 대한 핸들러를 재정의하거나 재정의합니다. – Marco

+0

그럼, 좋은 생각이지만, 응용 프로그램의 런타임 중에 필요에 따라 비활성화하고 활성화하려면 ... – derape

관련 문제