1 /* $Id: message.c,v 1.9 2002/09/07 15:12:45 chorns Exp $
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
17 GetMessageExtraInfo(VOID
)
65 User32FreeAsciiConvertedMessage(UINT Msg
, WPARAM wParam
, LPARAM lParam
)
71 ANSI_STRING AnsiString
;
72 UNICODE_STRING UnicodeString
;
75 InString
= (LPSTR
)lParam
;
76 TempString
= RtlAllocateHeap(RtlGetProcessHeap(), 0, strlen(lParam
));
77 strcpy(TempString
, InString
);
78 RtlInitAnsiString(&AnsiString
, TempString
);
79 UnicodeString
.Length
= wParam
;
80 UnicodeString
.MaximumLength
= wParam
;
81 UnicodeString
.Buffer
= (PWSTR
)lParam
;
82 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, FALSE
);
83 RtlFreeHeap(RtlGetProcessHeap(), 0, TempString
);
90 Cs
= (CREATESTRUCTA
*)lParam
;
91 RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR
)Cs
->lpszName
);
92 RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR
)Cs
->lpszClass
);
93 RtlFreeHeap(RtlGetProcessHeap(), 0, Cs
);
100 User32ConvertToAsciiMessage(UINT
* Msg
, WPARAM
* wParam
, LPARAM
* lParam
)
108 UNICODE_STRING UString
;
111 CsW
= (CREATESTRUCTW
*)(*lParam
);
112 CsA
= User32AllocHeap(sizeof(CREATESTRUCTA
));
113 memcpy(CsA
, CsW
, sizeof(CREATESTRUCTW
));
115 RtlInitUnicodeString(&UString
, CsW
->lpszName
);
116 RtlUnicodeStringToAnsiString(&AString
, &UString
, TRUE
);
117 CsA
->lpszName
= AString
.Buffer
;
119 RtlInitUnicodeString(&UString
, CsW
->lpszClass
);
120 RtlUnicodeStringToAnsiString(&AString
, &UString
, TRUE
);
121 CsA
->lpszClass
= AString
.Buffer
;
123 (*lParam
) = (LPARAM
)CsA
;
131 User32FreeUnicodeConvertedMessage(UINT Msg
, WPARAM wParam
, LPARAM lParam
)
136 User32ConvertToUnicodeMessage(UINT
* Msg
, WPARAM
* wParam
, LPARAM
* lParam
)
141 CallWindowProcA(WNDPROC lpPrevWndFunc
,
147 if (IsWindowUnicode(hWnd
))
150 User32ConvertToUnicodeMessage(&Msg
, &wParam
, &lParam
);
151 Result
= lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
);
152 User32FreeUnicodeConvertedMessage(Msg
, wParam
, lParam
);
157 return(lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
));
162 CallWindowProcW(WNDPROC lpPrevWndFunc
,
168 if (!IsWindowUnicode(hWnd
))
171 User32ConvertToAsciiMessage(&Msg
, &wParam
, &lParam
);
172 Result
= lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
);
173 User32FreeAsciiConvertedMessage(Msg
, wParam
, lParam
);
178 return(lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
));
184 MsgiAnsiToUnicodeMessage(LPMSG UnicodeMsg
, LPMSG AnsiMsg
)
186 *UnicodeMsg
= *AnsiMsg
;
187 switch (AnsiMsg
->message
)
191 UnicodeMsg
->wParam
= UnicodeMsg
->wParam
/ 2;
199 MsgiAnsiToUnicodeReply(LPMSG UnicodeMsg
, LPMSG AnsiMsg
, LRESULT Result
)
201 switch (AnsiMsg
->message
)
205 ANSI_STRING AnsiString
;
206 UNICODE_STRING UnicodeString
;
209 InString
= (LPWSTR
)UnicodeMsg
->lParam
;
210 TempString
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
211 wcslen(InString
) * sizeof(WCHAR
));
212 wcscpy(TempString
, InString
);
213 RtlInitUnicodeString(&UnicodeString
, TempString
);
214 AnsiString
.Length
= AnsiMsg
->wParam
;
215 AnsiString
.MaximumLength
= AnsiMsg
->wParam
;
216 AnsiString
.Buffer
= (PSTR
)AnsiMsg
->lParam
;
217 RtlUnicodeStringToAnsiString(&AnsiString
, &UnicodeString
, FALSE
);
218 RtlFreeHeap(RtlGetProcessHeap(), 0, TempString
);
227 DispatchMessageA(CONST MSG
*lpmsg
)
229 return(NtUserDispatchMessage(lpmsg
));
233 DispatchMessageW(CONST MSG
*lpmsg
)
235 return(NtUserDispatchMessage((LPMSG
)lpmsg
));
246 return NtUserGetMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
);
257 return NtUserGetMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
);
269 return NtUserPeekMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
, wRemoveMsg
);
281 return NtUserPeekMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
, wRemoveMsg
);
292 return NtUserPostMessage(hWnd
, Msg
, wParam
, lParam
);
303 return NtUserPostMessage(hWnd
, Msg
, wParam
, lParam
);
321 return NtUserPostThreadMessage(idThread
, Msg
, wParam
, lParam
);
332 return NtUserPostThreadMessage(idThread
, Msg
, wParam
, lParam
);
336 SendMessageW(HWND hWnd
,
341 return(NtUserSendMessage(hWnd
, Msg
, wParam
, lParam
));
346 SendMessageA(HWND hWnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
)
353 AnsiMsg
.message
= Msg
;
354 AnsiMsg
.wParam
= wParam
;
355 AnsiMsg
.lParam
= lParam
;
357 if (!MsgiAnsiToUnicodeMessage(&UcMsg
, &AnsiMsg
))
361 Result
= SendMessageW(UcMsg
.hwnd
, UcMsg
.message
, UcMsg
.wParam
, UcMsg
.lParam
);
362 if (!MsgiAnsiToUnicodeReply(&UcMsg
, &AnsiMsg
, Result
))
371 SendMessageCallbackA(
376 SENDASYNCPROC lpCallBack
,
379 return NtUserSendMessageCallback(
390 SendMessageCallbackW(
395 SENDASYNCPROC lpCallBack
,
398 return NtUserSendMessageCallback(
416 PDWORD_PTR lpdwResult
)
430 PDWORD_PTR lpdwResult
)
460 TranslateMessage(CONST MSG
*lpMsg
)
462 return(NtUserTranslateMessage((LPMSG
)lpMsg
, 0));
473 RegisterWindowMessageA(LPCSTR lpString
)
475 UNICODE_STRING String
;
479 Result
= RtlCreateUnicodeStringFromAsciiz(&String
, lpString
);
484 Atom
= RegisterWindowMessageW(String
.Buffer
);
485 RtlFreeUnicodeString(&String
);
490 RegisterWindowMessageW(LPCWSTR lpString
)
492 return(NtUserRegisterWindowMessage(lpString
));