PostThreadMessageA 함수(winuser.h)

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

구문

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

매개 변수

[in] idThread

형식:DWORD

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

지정된 스레드에 메시지 큐가 없으면 함수가 실패합니다. 스레드가 사용자 또는 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 헤더는 POSTThreadMessage를 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 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