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.
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
Sumber Daya Lainnya
Referensi