2012-05-19 6 views
0

win32 API에 액세스하여 작업 표시 줄의 위치, 크기, 상태 및 가장자리를 가져 오는 클래스가 있습니다. 이 클래스를 사용하여 작업 표시 줄의 위치에 따라 경고를 생성 할 위치를 알 수 있습니다. 새 경고가 생성되거나 삭제 될 때 작업 표시 줄이 언제인지에 따라 경고 위치를 업데이트하는 방법이 있습니다.작업 표시 줄이 움직일 수 있습니까?

업데이트 방법을 호출 할 수 있도록 작업 표시 줄이 움직일 때 감지하는 방법이 있습니까? 그런 식으로 사용자가 작업 표시 줄을 움직이면 경고는 새 경고가 오거나 하나가 삭제 될 때까지 어리석은 위치가 아닌 적절한 위치로 이동합니다.

내 생각에 타이머가 현재 작업 표시 줄 개체에 대해 매 초마다 새 것으로 생성 된 것을 확인하고 뭔가가 변경되면 업데이트 메서드를 호출하는 것이 었습니다. 나는 이것을하기위한 "더 쉬운"또는 "더 나은"방법이 있는지 궁금 할뿐입니다. (비주얼 스튜디오 2,010 C#을 사용)

TL , 작업 표시 줄이 메소드를 호출 할 때 이동 DR을 검출 할 필요가있다.

+0

호 다만, 사용자가 지속적으로 주위의 작업 표시 줄을 이동하지 않습니다하지 않습니다

여기 시작하는 링크입니다. SHAppBarMessage()를 ABM_GETTASKBARPOS와 함께 사용하여 바가 새 경고 창을 배치하는 위치를 찾으십시오. 타이머 틱에서 그렇게하고 싶다면 밀리 세컨드마다하지 않는 한 그다지 틀린 것은 없습니다. –

+1

이 작업을 수행하는 올바른 방법은 경고를 표시하기 직전에 작업 표시 줄 위치를 묻는 것입니다. 작업 표시 줄을 이동하거나 타이머를 사용할 때 알림을받는 것은 완전히 필요하지 않습니다. –

+0

응용 프로그램이 시작될 때 또는 새 경고가 생성/삭제 된 다음 경고 위치를 업데이트 할 때 이미 작업 표시 줄 위치를보고 있습니다. 문제는이 경고 시스템이 거의 사용되지 않지만 문제가 끝날 때까지 일정 시간 동안 사용자 컴퓨터에서 경고 메시지가 화면에 남을 수 있습니다. 따라서 작업 표시 줄이 움직일 확률은 높지만 움직이지 않는 경고는 사람들이 불평 할 문제가 될 수 있습니다. – flip66

답변

-1

일반 아이디어, 작업 표시 줄 창을 하위 클래스해야합니다. 이제 모든 창은 시스템 또는 다른 창에서 보낸 모든 메시지를 처리하는 WndProc (창 프로 시저)를 정의합니다.

이 함수에 직접 액세스 할 수는 없지만 적절한 API (SetWindowLong)를 사용하여 메시지 흐름을 원하는 다른 WndProc 함수로 리디렉션 할 수 있습니다. 이전 WndProc을 호출하여 대상 창 기능 정상적으로).

이렇게하면 대상 창에서 수신 한 모든 메시지를 모니터링 할 수 있습니다. 특히, 귀하의 경우에는 WM_MOVE 메시지.

이것은 단순한 설명이며 철저히 읽는 것이 좋습니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633569(v=vs.85).aspx

+1

-1. 이것은 잘못된 것입니다. 작업 표시 줄 창을 서브 클래 싱하는 것은 피해야하는 최후의 수단 해킹입니다.시스템의 모든 응용 프로그램에 대해 호출되는 함수 오버 헤드를 추가하고 시스템이 충돌 할 경우 문제가 발생합니다. 어떤 이유로 시스템 레벨의 윈드 프로 시저를 서브 클래스 할 필요가 있다고 느낀다면, 아마 뭔가 잘못된 것이 있습니다. –

+0

함수 호출시 오버 헤드가 발생하지 않습니다. 이것은 후크가 아닙니다. 나는 당신이 잘못된 생각을하고 있다고 생각합니다. –

+0

확인. 좋은 해결책이있을 때 불필요하게 하위 클래스로 분류하려면 -1. 필요하지 않은 경우 WndProc을 교체하는 것은 잘못되었습니다. 보다 나은? 관심있는 모든 것이 가끔 경고를 표시 할 수있는 곳이면 "대상 창에서받은 모든 메시지를 모니터링"할 필요가 없습니다. 아주 드물게 발생하는 메시지를 탐지하기 위해 전송되는 수천 개의 창 메시지를 포착 할 필요가 없습니다. –

관련 문제