1 /* $Id: message.c,v 1.13 2003/05/02 07:52:33 gvg 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
18 GetMessageExtraInfo(VOID
)
66 User32FreeAsciiConvertedMessage(UINT Msg
, WPARAM wParam
, LPARAM lParam
)
72 ANSI_STRING AnsiString
;
73 UNICODE_STRING UnicodeString
;
76 InString
= (LPSTR
)lParam
;
77 TempString
= RtlAllocateHeap(RtlGetProcessHeap(), 0, strlen(InString
));
78 strcpy(TempString
, InString
);
79 RtlInitAnsiString(&AnsiString
, TempString
);
80 UnicodeString
.Length
= wParam
;
81 UnicodeString
.MaximumLength
= wParam
;
82 UnicodeString
.Buffer
= (PWSTR
)lParam
;
83 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, FALSE
);
84 RtlFreeHeap(RtlGetProcessHeap(), 0, TempString
);
91 Cs
= (CREATESTRUCTA
*)lParam
;
92 RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR
)Cs
->lpszName
);
93 RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR
)Cs
->lpszClass
);
94 RtlFreeHeap(RtlGetProcessHeap(), 0, Cs
);
101 User32ConvertToAsciiMessage(UINT
* Msg
, WPARAM
* wParam
, LPARAM
* lParam
)
109 UNICODE_STRING UString
;
112 CsW
= (CREATESTRUCTW
*)(*lParam
);
113 CsA
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(CREATESTRUCTA
));
114 memcpy(CsA
, CsW
, sizeof(CREATESTRUCTW
));
116 RtlInitUnicodeString(&UString
, CsW
->lpszName
);
117 RtlUnicodeStringToAnsiString(&AString
, &UString
, TRUE
);
118 CsA
->lpszName
= AString
.Buffer
;
120 RtlInitUnicodeString(&UString
, CsW
->lpszClass
);
121 RtlUnicodeStringToAnsiString(&AString
, &UString
, TRUE
);
122 CsA
->lpszClass
= AString
.Buffer
;
124 (*lParam
) = (LPARAM
)CsA
;
132 User32FreeUnicodeConvertedMessage(UINT Msg
, WPARAM wParam
, LPARAM lParam
)
137 User32ConvertToUnicodeMessage(UINT
* Msg
, WPARAM
* wParam
, LPARAM
* lParam
)
142 CallWindowProcA(WNDPROC lpPrevWndFunc
,
148 if (IsWindowUnicode(hWnd
))
151 User32ConvertToUnicodeMessage(&Msg
, &wParam
, &lParam
);
152 Result
= lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
);
153 User32FreeUnicodeConvertedMessage(Msg
, wParam
, lParam
);
158 return(lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
));
163 CallWindowProcW(WNDPROC lpPrevWndFunc
,
169 if (!IsWindowUnicode(hWnd
))
172 User32ConvertToAsciiMessage(&Msg
, &wParam
, &lParam
);
173 Result
= lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
);
174 User32FreeAsciiConvertedMessage(Msg
, wParam
, lParam
);
179 return(lpPrevWndFunc(hWnd
, Msg
, wParam
, lParam
));
185 MsgiAnsiToUnicodeMessage(LPMSG UnicodeMsg
, LPMSG AnsiMsg
)
187 *UnicodeMsg
= *AnsiMsg
;
188 switch (AnsiMsg
->message
)
192 UnicodeMsg
->wParam
= UnicodeMsg
->wParam
/ 2;
200 MsgiAnsiToUnicodeReply(LPMSG UnicodeMsg
, LPMSG AnsiMsg
, LRESULT Result
)
202 switch (AnsiMsg
->message
)
206 ANSI_STRING AnsiString
;
207 UNICODE_STRING UnicodeString
;
210 InString
= (LPWSTR
)UnicodeMsg
->lParam
;
211 TempString
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
212 wcslen(InString
) * sizeof(WCHAR
));
213 wcscpy(TempString
, InString
);
214 RtlInitUnicodeString(&UnicodeString
, TempString
);
215 AnsiString
.Length
= AnsiMsg
->wParam
;
216 AnsiString
.MaximumLength
= AnsiMsg
->wParam
;
217 AnsiString
.Buffer
= (PSTR
)AnsiMsg
->lParam
;
218 RtlUnicodeStringToAnsiString(&AnsiString
, &UnicodeString
, FALSE
);
219 RtlFreeHeap(RtlGetProcessHeap(), 0, TempString
);
228 DispatchMessageA(CONST MSG
*lpmsg
)
230 return(NtUserDispatchMessage(lpmsg
));
234 DispatchMessageW(CONST MSG
*lpmsg
)
236 return(NtUserDispatchMessage((LPMSG
)lpmsg
));
247 return NtUserGetMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
);
258 return NtUserGetMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
);
270 return NtUserPeekMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
, wRemoveMsg
);
282 return NtUserPeekMessage(lpMsg
, hWnd
, wMsgFilterMin
, wMsgFilterMax
, wRemoveMsg
);
293 return NtUserPostMessage(hWnd
, Msg
, wParam
, lParam
);
304 return NtUserPostMessage(hWnd
, Msg
, wParam
, lParam
);
312 (void) NtUserPostMessage(NULL
, WM_QUIT
, nExitCode
, 0);
323 return NtUserPostThreadMessage(idThread
, Msg
, wParam
, lParam
);
334 return NtUserPostThreadMessage(idThread
, Msg
, wParam
, lParam
);
338 SendMessageW(HWND hWnd
,
343 return(NtUserSendMessage(hWnd
, Msg
, wParam
, lParam
));
348 SendMessageA(HWND hWnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
)
355 AnsiMsg
.message
= Msg
;
356 AnsiMsg
.wParam
= wParam
;
357 AnsiMsg
.lParam
= lParam
;
359 if (!MsgiAnsiToUnicodeMessage(&UcMsg
, &AnsiMsg
))
363 Result
= SendMessageW(UcMsg
.hwnd
, UcMsg
.message
, UcMsg
.wParam
, UcMsg
.lParam
);
364 if (!MsgiAnsiToUnicodeReply(&UcMsg
, &AnsiMsg
, Result
))
373 SendMessageCallbackA(
378 SENDASYNCPROC lpCallBack
,
381 return NtUserSendMessageCallback(
392 SendMessageCallbackW(
397 SENDASYNCPROC lpCallBack
,
400 return NtUserSendMessageCallback(
418 PDWORD_PTR lpdwResult
)
432 PDWORD_PTR lpdwResult
)
462 TranslateMessage(CONST MSG
*lpMsg
)
464 return(NtUserTranslateMessage((LPMSG
)lpMsg
, 0));
475 RegisterWindowMessageA(LPCSTR lpString
)
477 UNICODE_STRING String
;
481 Result
= RtlCreateUnicodeStringFromAsciiz(&String
, (PCSZ
)lpString
);
486 Atom
= NtUserRegisterWindowMessage(&String
);
487 RtlFreeUnicodeString(&String
);
492 RegisterWindowMessageW(LPCWSTR lpString
)
494 UNICODE_STRING String
;
496 RtlInitUnicodeString(&String
, lpString
);
497 return(NtUserRegisterWindowMessage(&String
));