Bagikan melalui


Fungsi PostThreadMessageW (winuser.h)

Memposting pesan ke antrean pesan dari utas yang ditentukan. Ini kembali tanpa menunggu utas memproses pesan.

Sintaks

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

Parameter

[in] idThread

Jenis: DWORD

Pengidentifikasi utas tempat pesan akan diposting.

Fungsi gagal jika utas yang ditentukan tidak memiliki antrean pesan. Sistem membuat antrean pesan utas ketika utas melakukan panggilan pertamanya ke salah satu fungsi Pengguna atau GDI. Untuk informasi lebih lanjut, lihat bagian Keterangan.

Postingan pesan tunduk pada UIPI. Utas proses hanya dapat memposting pesan ke antrean utas pesan yang diposting dalam proses tingkat integritas yang lebih rendah atau sama.

Utas ini harus memiliki hak istimewa SE_TCB_NAME untuk memposting pesan ke utas yang termasuk dalam proses dengan pengidentifikasi unik lokal (LUID) yang sama tetapi berada di desktop yang berbeda. Jika tidak, fungsi gagal dan mengembalikan ERROR_INVALID_THREAD_ID.

Utas ini harus milik desktop yang sama dengan utas panggilan atau ke proses dengan LUID yang sama. Jika tidak, fungsi gagal dan mengembalikan ERROR_INVALID_THREAD_ID.

[in] Msg

Jenis: UINT

Jenis pesan yang akan diposting.

[in] wParam

Jenis: WPARAM

Informasi khusus pesan tambahan.

[in] lParam

Jenis: LPARAM

Informasi khusus pesan tambahan.

Mengembalikan nilai

Jenis: BOOL

Jika fungsi berhasil, nilai yang dikembalikan bukan nol.

Jika fungsi gagal, nilai yang dikembalikan adalah nol. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError. GetLastError mengembalikan ERROR_INVALID_THREAD_ID jika idThread bukan pengidentifikasi utas yang valid, atau jika utas yang ditentukan oleh idThread tidak memiliki antrean pesan. GetLastError mengembalikan ERROR_NOT_ENOUGH_QUOTA saat batas pesan terpaut.

Keterangan

Ketika pesan diblokir oleh UIPI, kesalahan terakhir, diambil dengan GetLastError, diatur ke 5 (akses ditolak).

Utas tempat pesan diposting harus membuat antrean pesan, atau panggilan ke PostThreadMessage gagal. Gunakan metode berikut untuk menangani situasi ini.

  • Buat objek peristiwa, lalu buat utas.
  • Gunakan fungsi WaitForSingleObject untuk menunggu peristiwa diatur ke status yang disinyalkan sebelum memanggil PostThreadMessage.
  • Di utas tempat pesan akan diposting, panggil PeekMessage seperti yang ditunjukkan di sini untuk memaksa sistem membuat antrean pesan.

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

  • Atur peristiwa, untuk menunjukkan bahwa utas siap menerima pesan yang diposting.
Utas tempat pesan diposting mengambil pesan dengan memanggil fungsi GetMessage atau PeekMessage . Anggota hwnd dari struktur MSG yang dikembalikan adalah NULL.

Pesan yang diposting oleh PostThreadMessage tidak terkait dengan jendela. Sebagai aturan umum, pesan yang tidak terkait dengan jendela tidak dapat dikirim oleh fungsi DispatchMessage . Oleh karena itu, jika utas penerima berada dalam perulangan modal (seperti yang digunakan oleh MessageBox atau DialogBox), pesan akan hilang. Untuk mencegat pesan utas saat berada dalam perulangan modal, gunakan kait khusus utas.

Sistem hanya melakukan marshalling untuk pesan sistem (yang berada dalam rentang 0 hingga (WM_USER-1)). Untuk mengirim pesan lain (pesan >= WM_USER) ke proses lain, Anda harus melakukan marshalling kustom.

Ada batas 10.000 pesan yang diposting per antrean pesan. Batas ini harus cukup besar. Jika aplikasi Anda melebihi batas, aplikasi harus dirancang ulang untuk menghindari penggunaan begitu banyak sumber daya sistem. Untuk menyesuaikan batas ini, ubah kunci registri berikut.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               Windows
                  USERPostMessageLimit

Nilai minimum yang dapat diterima adalah 4000.

Catatan

Header winuser.h mendefinisikan PostThreadMessage sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta pra-prosesor UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.

Persyaratan

   
Klien minimum yang didukung Windows 2000 Professional [hanya aplikasi desktop]
Server minimum yang didukung Windows 2000 Server [hanya aplikasi desktop]
Target Platform Windows
Header winuser.h (sertakan Windows.h)
Pustaka User32.lib
DLL User32.dll
Set API ext-ms-win-ntuser-message-l1-1-0 (diperkenalkan dalam Windows 8)

Lihat juga

Konseptual

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

MSG

Pesan dan Antrean Pesan

Sumber Daya Lainnya

PeekMessage

PostMessage

Referensi

tidur

WaitForSingleObject