다음을 통해 공유


PostThreadMessageW 함수(winuser.h)

지정된 스레드의 메시지 큐에 메시지를 게시합니다. 스레드가 메시지를 처리할 때까지 기다리지 않고 반환됩니다.

구문

BOOL PostThreadMessageW(
  [in] DWORD  idThread,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

매개 변수

[in] idThread

형식:DWORD

메시지를 게시할 스레드의 식별자입니다.

지정된 스레드에 메시지 큐가 없으면 함수가 실패합니다. 스레드가 User 또는 GDI 함수 중 하나를 처음 호출할 때 시스템은 스레드의 메시지 큐를 만듭니다. 자세한 내용은 주의 섹션을 참조하세요.

메시지 게시에는 UIPI가 적용됩니다. 프로세스의 스레드는 무결성 수준이 낮거나 같은 프로세스의 게시된 메시지 큐에만 메시지를 게시할 수 있습니다.

이 스레드는 동일한 로컬 고유 식별자(LUID)를 사용하는 프로세스에 속하지만 다른 데스크톱에 있는 스레드에 메시지를 게시하려면 SE_TCB_NAME 권한이 있어야 합니다. 그렇지 않으면 함수가 실패하고 ERROR_INVALID_THREAD_ID 반환합니다.

이 스레드는 호출 스레드와 동일한 데스크톱 또는 동일한 LUID가 있는 프로세스에 속해야 합니다. 그렇지 않으면 함수가 실패하고 ERROR_INVALID_THREAD_ID 반환합니다.

[in] Msg

형식: UINT

게시할 메시지의 유형입니다.

[in] wParam

형식: WPARAM

추가 메시지 관련 정보입니다.

[in] lParam

형식: LPARAM

추가 메시지 관련 정보입니다.

반환 값

형식: BOOL

함수가 성공하면 반환 값이 0이 아닙니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다. getLastErroridThread가 유효한 스레드 식별자가 아니거나 idThread로 지정된 스레드에 메시지 큐가 없는 경우 ERROR_INVALID_THREAD_ID 반환합니다. GetLastError 는 메시지 제한에 도달하면 ERROR_NOT_ENOUGH_QUOTA 반환합니다.

설명

메시지가 UIPI에 의해 차단되면 GetLastError를 사용하여 검색된 마지막 오류가 5(액세스 거부)로 설정됩니다.

메시지가 게시되는 스레드는 메시지 큐를 만들었어야 합니다. 그렇지 않으면 PostThreadMessage 에 대한 호출이 실패합니다. 이 상황을 처리하려면 다음 메서드를 사용합니다.

  • 이벤트 개체를 만든 다음 스레드를 만듭니다.
  • WaitForSingleObject 함수를 사용하여 PostThreadMessage를 호출하기 전에 이벤트가 신호 상태로 설정될 때까지 기다립니다.
  • 메시지가 게시될 스레드에서 여기에 표시된 대로 PeekMessage 를 호출하여 시스템에서 메시지 큐를 만들도록 합니다.

    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

  • 스레드가 게시된 메시지를 받을 준비가 되었음을 나타내기 위해 이벤트를 설정합니다.
메시지가 게시되는 스레드는 GetMessage 또는 PeekMessage 함수를 호출하여 메시지를 검색 합니다 . 반환된 MSG 구조체의 hwnd 멤버는 NULL입니다.

PostThreadMessage에서 게시한 메시지는 창과 연결되지 않습니다. 일반적으로 창과 연결되지 않은 메시지는 DispatchMessage 함수에서 디스패치할 수 없습니다. 따라서 받는 사람 스레드가 모달 루프에 있는 경우( MessageBox 또는 DialogBox에서 사용) 메시지가 손실됩니다. 모달 루프에서 스레드 메시지를 가로채려면 스레드별 후크를 사용합니다.

시스템은 시스템 메시지(0~(WM_USER-1) 범위의 메시지)에 대해서만 마샬링을 수행합니다. 다른 메시지(그 >= WM_USER)를 다른 프로세스로 보내려면 사용자 지정 마샬링을 수행해야 합니다.

메시지 큐당 게시된 메시지는 10,000으로 제한됩니다. 이 제한은 충분히 커야 합니다. 애플리케이션이 제한을 초과하는 경우 너무 많은 시스템 리소스를 사용하지 않도록 다시 디자인해야 합니다. 이 제한을 조정하려면 다음 레지스트리 키를 수정합니다.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               Windows
                  USERPostMessageLimit

허용되는 최소 값은 4000입니다.

참고

winuser.h 헤더는 UNICODE 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 PostThreadMessage를 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 winuser.h(Windows.h 포함)
라이브러리 User32.lib
DLL User32.dll
API 세트 ext-ms-win-ntuser-message-l1-1-0(Windows 8 도입)

추가 정보

개념

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

메시지

메시지 및 메시지 큐

기타 리소스

PeekMessage

PostMessage

참조

Sleep

WaitForSingleObject