2009-05-28 3 views
2

내 응용 프로그램에는 백그라운드 스레드에서 실행중인 작업이 있습니다. MessageBox 또는 모달 대화 상자가 UI 스레드에 표시 될 때 백그라운드 스레드에서 알림이 필요합니다.양식에 메시지 상자가 표시되는시기를 아는 방법은 무엇입니까?

MessageBox를 표시하기 전에 일부 기능을 호출하여 수동으로 수행 할 수 있지만 그렇게하지 않으면 좋을 것입니다. 예컨대 들어

:

backgroundThread.MessageShown(); // I do not want to call this explicitly every time! 
MessageBox.Show("Task halted!"); 

내가 거기 추측하고 수도 나에 푹 수있는 몇 가지 메시지. 주 GUI 스레드에서도 모달 대화 상자가 표시되기 전에 시작되는 모든 메시지/이벤트가 있습니까?

좋아, 여기에 요구 사항이 있습니다. UI 스레드에서 수행되는 몇 가지 작업이 있으며 작업자 스레드에 표시된 별도의 대화 상자에서 진행 상황을 표시해야합니다. 나는 그것이 작업자 스레드에서 수행되어야하는 작업이되어야한다는 것을 알고 있지만 당분간은 현재 시나리오를 변경할 수 없습니다.

모든 결함이 하나의 결함을 제외하고 잘 작동합니다. 메시지 상자가 UI 스레드에 표시되면 진행률 대화 상자 아래에 숨겨집니다. 따라서 사용자는 UI가 입력을 기다리는 것을 결코 알 수 없습니다. 모달 대화 상자가 표시되었고 진행 대화 상자를 숨겨야한다는 알림을받을 방법이 필요합니다.

지금 당장 MessageBox를 호출하기 전에이를 명시 적으로 숨겨야합니다.

설명 드리겠습니다.

+0

이것은 좋지 않을 수도 있지만 * 배경 스레드가 UI 상태에 대해 알아야하는 이유는 무엇입니까? –

+0

@Damien_The_Unbeliever : 백그라운드 스레드가 UI 스레드이기 때문에 전경 UI 스레드에 따라 작동해야합니다! – nullDev

답변

5

CBT Hook을 설정합니다. 그런 다음 생성, 활성화, 비활성화 및 파괴 된 모든 윈도우에 대한 알림을 받게됩니다. 그런 다음 GetWindowClass를 사용하여 생성/활성화 된 hWnd가 실제로 MessageBox인지 확인합니다.

+0

감사합니다 danbystrom, 이것은 내가 찾고있는 것입니다! – nullDev

+0

기꺼이 도와 드리겠습니다! +100 주셔서 감사합니다. :-) –

2

Show를 호출 할 때 이벤트를 발생시키는 고유 한 메시지 상자를 만드시겠습니까?

+0

좋아, 조금 더 많은 정보 : 나는 이것을 기존의 어플리케이션에서 사용할 것이므로, 모든 호출을 바꾸고 변경하는 것은 끔찍할 것이다! 그리고 앞서 말했듯이 _any_ 모달 대화 상자에 대한 알림을 원합니다. – nullDev

+0

흠 당신이 부르는 랩퍼의 종류 : MBWrapper (MB_OK, "text"); MBWrapper가 이벤트를 발생시키고 MessageBox.Show를 호출합니까? – RvdK

0

MessageBox의 상위 항목이 TopMost 인 경우 MessageBox가 TopMost가됩니다. 그래서, 뭔가 같은 ...

MessageBox.Show(new Form() { TopMost = true }, "Message and so forth ..."); 

이것은 또한 ... 당신을 위해

DllImport("user32.dll")] 
public static extern int MessageBox(int hWnd, String text, String caption, uint type); 

일을 그리고 유형으로 MB_TOPMOST을 전달할 수 있습니다.

관련 문제