2009-12-23 4 views

답변

2

이것은 sendMessage 첨부가 호출되기 때문에 설명 할 수 HWND_BROADCAST은 먼저 사용 가능한 모든 창을 열거하고 각 창에 대해 SendMessage를 호출합니다 .Windows가 메시지 처리를 마칠 때까지 SendMessage가 반환되지 않습니다. 단일 창에서 메시지를 처리하는 데 오랜 시간이 걸리면 전체 호출이 지연됩니다 .

+1

더욱 나쁜 것은, 호출 된 윈도우 프로 시저 * never *가 SendMessage()를 반환하지 않으면 응용 프로그램이 영구적으로 정지된다는 것입니다. 일반적으로 말하자면, 다른 응용 프로그램의 윈도우가 임의의 메시지 (RegisterMessage()로 만든 것조차도)에 어떻게 반응하는지 알 수있는 방법이 없습니다. 간단히 말하면, SendMessage()를 호출하여 윈도우가 무엇인지, 그리고 윈도우가 정확히 어떻게 반응하는지 알지 못하는 한, 윈도우에 메시지를 보내지 않아야합니다. –

0

SendMessageTimeout이 있습니다. 수신자가 수락하기를 기다리는 동안 애플리케이션이 차단하는 시간이 제한됩니다.

또 다른 해결 방법은 여러 스레드를 실행하고 한 번에 (즉 병렬로) 여러 메시지를 전달하도록하는 것입니다. 그런 다음 수신기 중 하나가 멈 추면 전체 앱을 죽이지 않습니다.

0

메시지 펌프가 있지만 메시지를 펌핑하지 않는 프로세스가 하나 이상 있습니다. SendMessage는 모든 수신자가 메시지를 처리 ​​할 때까지 리턴하지 않으므로 리턴하지 않습니다. 대신 SendMessageTimeout을 사용하여이 문제를 해결할 수 있습니다.

덧붙여서 프로세스를 시작하고 프로세스 핸들을 기다리는 것이 문제가 될 수 있습니다. 나는 나의 웹 사이트 here에 이것을 기술한다.

15

최상위 창을 있지만 해당 창을 만든 스레드에서 GetMessage 또는 PeekMessage를 호출하지 않는 프로세스가있을 때 발생합니다.

Windows 3.0과의 이전 버전과의 호환성을 위해 시스템의 모든 최상위 창이 브로드 캐스트에 응답 할 때까지 SendMessage가 반환되지 않습니다. SendMessage()는 다른 프로세스로 보내지 않아도 차단되지 않기 때문에이 동작은 Windows가 다중 스레드되기 전에 되돌아 왔습니다.

하지만 Win32에서부터 SendMessage를 다른 프로세스의 창으로 보내면 다른 프로세스의 스레드가 깨어나서 메시지를 처리 ​​할 때까지 스레드 블록이 실제로 발생합니다. 해당 스레드가 사용 중이거나 메시지를 펌핑하지 않는 경우 영원히 기다립니다.

그런 이유로 HWND_BROADCAST를 사용할 때 항상 SendNotifyMessage 또는 SendMessageTimeout을 사용해야하며, 그렇지 않으면 다른 프로세스가 소유 한 창으로 메시지를 보내야합니다.

관련 문제