3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS user32.dll
5 * FILE: lib/user32/windows/message.c
7 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 * 06-06-2001 CSH Created
21 GetMessageExtraInfo(VOID)
35 PUSER32_THREAD_DATA ThreadData = User32GetThreadData();
36 return(MAKELONG(ThreadData->LastMessage.pt.x, ThreadData->LastMessage.pt.y));
46 PUSER32_THREAD_DATA ThreadData = User32GetThreadData();
47 return(ThreadData->LastMessage.time);
102 User32FreeAsciiConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
108 ANSI_STRING AnsiString;
109 UNICODE_STRING UnicodeString;
112 InString = (LPSTR)lParam;
113 TempString = RtlAllocateHeap(RtlGetProcessHeap(), 0, strlen(InString) + 1);
114 strcpy(TempString, InString);
115 RtlInitAnsiString(&AnsiString, TempString);
116 UnicodeString.Length = wParam * sizeof(WCHAR);
117 UnicodeString.MaximumLength = wParam * sizeof(WCHAR);
118 UnicodeString.Buffer = (PWSTR)lParam;
119 if (! NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeString,
125 UnicodeString.Buffer[0] = L'\0';
128 RtlFreeHeap(RtlGetProcessHeap(), 0, TempString);
133 ANSI_STRING AnsiString;
134 RtlInitAnsiString(&AnsiString, (PSTR) lParam);
135 RtlFreeAnsiString(&AnsiString);
142 Cs = (CREATESTRUCTA*)lParam;
143 RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR)Cs->lpszName);
144 if (HIWORD((ULONG)Cs->lpszClass) != 0)
146 RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR)Cs->lpszClass);
148 RtlFreeHeap(RtlGetProcessHeap(), 0, Cs);
156 User32ConvertToAsciiMessage(UINT* Msg, WPARAM* wParam, LPARAM* lParam)
164 UNICODE_STRING UString;
167 CsW = (CREATESTRUCTW*)(*lParam);
168 CsA = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(CREATESTRUCTA));
169 memcpy(CsA, CsW, sizeof(CREATESTRUCTW));
171 RtlInitUnicodeString(&UString, CsW->lpszName);
172 RtlUnicodeStringToAnsiString(&AString, &UString, TRUE);
173 CsA->lpszName = AString.Buffer;
174 if (HIWORD((ULONG)CsW->lpszClass) != 0)
176 RtlInitUnicodeString(&UString, CsW->lpszClass);
177 RtlUnicodeStringToAnsiString(&AString, &UString, TRUE);
178 CsA->lpszClass = AString.Buffer;
180 (*lParam) = (LPARAM)CsA;
185 ANSI_STRING AnsiString;
186 UNICODE_STRING UnicodeString;
187 RtlInitUnicodeString(&UnicodeString, (PWSTR) *lParam);
188 if (NT_SUCCESS(RtlUnicodeStringToAnsiString(&AnsiString,
192 *lParam = (LPARAM) AnsiString.Buffer;
201 User32FreeUnicodeConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
208 User32ConvertToUnicodeMessage(UINT* Msg, WPARAM* wParam, LPARAM* lParam)
218 CallWindowProcA(WNDPROC lpPrevWndFunc,
225 if ((DWORD)lpPrevWndFunc > 0x80000000)
227 lpPrevWndFunc -= 0x80000000;
234 if (IsWindowUnicode(hWnd))
237 User32ConvertToUnicodeMessage(&Msg, &wParam, &lParam);
238 Result = lpPrevWndFunc(hWnd, Msg, wParam, lParam);
239 User32FreeUnicodeConvertedMessage(Msg, wParam, lParam);
244 return(lpPrevWndFunc(hWnd, Msg, wParam, lParam));
253 CallWindowProcW(WNDPROC lpPrevWndFunc,
260 if ((DWORD)lpPrevWndFunc > 0x80000000)
262 lpPrevWndFunc-= 0x80000000;
269 if (!IsWindowUnicode(hWnd))
272 User32ConvertToAsciiMessage(&Msg, &wParam, &lParam);
273 Result = lpPrevWndFunc(hWnd, Msg, wParam, lParam);
274 User32FreeAsciiConvertedMessage(Msg, wParam, lParam);
279 return(lpPrevWndFunc(hWnd, Msg, wParam, lParam));
285 MsgiAnsiToUnicodeMessage(LPMSG UnicodeMsg, LPMSG AnsiMsg)
287 *UnicodeMsg = *AnsiMsg;
288 switch (AnsiMsg->message)
292 UnicodeMsg->wParam = UnicodeMsg->wParam / 2;
297 ANSI_STRING AnsiString;
298 UNICODE_STRING UnicodeString;
299 RtlInitAnsiString(&AnsiString, (PSTR) AnsiMsg->lParam);
300 if (! NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeString,
306 UnicodeMsg->lParam = (LPARAM) UnicodeString.Buffer;
315 MsgiAnsiToUnicodeReply(LPMSG UnicodeMsg, LPMSG AnsiMsg, LRESULT Result)
317 switch (AnsiMsg->message)
321 ANSI_STRING AnsiString;
322 UNICODE_STRING UnicodeString;
325 InString = (LPWSTR)UnicodeMsg->lParam;
326 TempString = RtlAllocateHeap(RtlGetProcessHeap(), 0,
327 wcslen(InString) * sizeof(WCHAR));
328 wcscpy(TempString, InString);
329 RtlInitUnicodeString(&UnicodeString, TempString);
330 AnsiString.Length = AnsiMsg->wParam;
331 AnsiString.MaximumLength = AnsiMsg->wParam;
332 AnsiString.Buffer = (PSTR)AnsiMsg->lParam;
333 RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE);
334 RtlFreeHeap(RtlGetProcessHeap(), 0, TempString);
339 UNICODE_STRING UnicodeString;
340 RtlInitUnicodeString(&UnicodeString, (PCWSTR) UnicodeMsg->lParam);
341 RtlFreeUnicodeString(&UnicodeString);
353 DispatchMessageA(CONST MSG *lpmsg)
355 return(NtUserDispatchMessage(lpmsg));
363 DispatchMessageW(CONST MSG *lpmsg)
365 return(NtUserDispatchMessage((LPMSG)lpmsg));
373 GetMessageA(LPMSG lpMsg,
379 PUSER32_THREAD_DATA ThreadData = User32GetThreadData();
381 Res = NtUserGetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
382 if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT)
384 ThreadData->LastMessage = *lpMsg;
394 GetMessageW(LPMSG lpMsg,
400 PUSER32_THREAD_DATA ThreadData = User32GetThreadData();
402 Res = NtUserGetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
403 if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT)
405 ThreadData->LastMessage = *lpMsg;
415 PeekMessageA(LPMSG lpMsg,
422 PUSER32_THREAD_DATA ThreadData = User32GetThreadData();
424 Res = NtUserPeekMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
425 if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT)
427 ThreadData->LastMessage = *lpMsg;
446 PUSER32_THREAD_DATA ThreadData = User32GetThreadData();
448 Res = NtUserPeekMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
449 if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT)
451 ThreadData->LastMessage = *lpMsg;
468 return NtUserPostMessage(hWnd, Msg, wParam, lParam);
483 return NtUserPostMessage(hWnd, Msg, wParam, lParam);
495 (void) NtUserPostMessage(NULL, WM_QUIT, nExitCode, 0);
510 return NtUserPostThreadMessage(idThread, Msg, wParam, lParam);
525 return NtUserPostThreadMessage(idThread, Msg, wParam, lParam);
533 SendMessageW(HWND hWnd,
538 return(NtUserSendMessage(hWnd, Msg, wParam, lParam));
546 SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
553 AnsiMsg.message = Msg;
554 AnsiMsg.wParam = wParam;
555 AnsiMsg.lParam = lParam;
557 if (!MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg))
561 Result = SendMessageW(UcMsg.hwnd, UcMsg.message, UcMsg.wParam, UcMsg.lParam);
562 if (!MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, Result))
575 SendMessageCallbackA(
580 SENDASYNCPROC lpCallBack,
583 return NtUserSendMessageCallback(
598 SendMessageCallbackW(
603 SENDASYNCPROC lpCallBack,
606 return NtUserSendMessageCallback(
628 PDWORD_PTR lpdwResult)
647 PDWORD_PTR lpdwResult)
690 TranslateMessage(CONST MSG *lpMsg)
692 return(TranslateMessageEx((LPMSG)lpMsg, 0));
699 TranslateMessageEx(CONST MSG *lpMsg, DWORD unk)
701 return(NtUserTranslateMessage((LPMSG)lpMsg, unk));
712 return NtUserWaitMessage();
720 RegisterWindowMessageA(LPCSTR lpString)
722 UNICODE_STRING String;
726 Result = RtlCreateUnicodeStringFromAsciiz(&String, (PCSZ)lpString);
731 Atom = NtUserRegisterWindowMessage(&String);
732 RtlFreeUnicodeString(&String);
741 RegisterWindowMessageW(LPCWSTR lpString)
743 UNICODE_STRING String;
745 RtlInitUnicodeString(&String, lpString);
746 return(NtUserRegisterWindowMessage(&String));
753 SetCapture(HWND hWnd)
755 return(NtUserSetCapture(hWnd));
764 return(NtUserGetCapture());
773 NtUserSetCapture(NULL);
783 GetQueueStatus(UINT flags)
786 WORD changed_bits, wake_bits;
788 #if 0 /* wine stuff. don't know what it does... */
790 /* check for pending X events */
791 if (USER_Driver.pMsgWaitForMultipleObjectsEx)
792 USER_Driver.pMsgWaitForMultipleObjectsEx( 0, NULL, 0, 0, 0 );
795 ret = NtUserGetQueueStatus(TRUE /*ClearChanges*/);
797 changed_bits = LOWORD(ret);
798 wake_bits = HIWORD(ret);
800 return MAKELONG(changed_bits & flags, wake_bits & flags);
807 WINBOOL STDCALL GetInputState(VOID)
812 #if 0 /* wine stuff. don't know what it does... */
814 /* check for pending X events */
815 if (USER_Driver.pMsgWaitForMultipleObjectsEx)
816 USER_Driver.pMsgWaitForMultipleObjectsEx( 0, NULL, 0, 0, 0 );
819 ret = NtUserGetQueueStatus(FALSE /*ClearChanges*/);
821 wake_bits = HIWORD(ret);
823 return wake_bits & (QS_KEY | QS_MOUSEBUTTON);
829 WINBOOL STDCALL SetMessageQueue(int cMessagesMax)
831 /* Function does nothing on 32 bit windows */