00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include "precomp.h"
00012
#pragma hdrstop
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 BOOL xxxTranslateMessage(
00029 LPMSG pmsg,
00030 UINT uiTMFlags)
00031 {
00032
PTHREADINFO pti;
00033
UINT wMsgType;
00034
int cChar;
00035
BOOL fSysKey =
FALSE;
00036
DWORD dwKeyFlags;
00037 LPARAM lParam;
00038
UINT uVirKey;
00039
PWND pwnd;
00040 WCHAR awch[16];
00041 WCHAR *pwch;
00042
00043
switch (pmsg->message) {
00044
00045
default:
00046
return FALSE;
00047
00048
case WM_SYSKEYDOWN:
00049
00050
00051
00052
00053
00054 fSysKey =
TRUE;
00055
00056
00057
00058
00059
case WM_SYSKEYUP:
00060
case WM_KEYDOWN:
00061
case WM_KEYUP:
00062 pti =
PtiCurrent();
00063
00064
if ((pti->
pMenuState !=
NULL) &&
00065 (
HW(pti->
pMenuState->
pGlobalPopupMenu->
spwndPopupMenu) ==
00066 pmsg->hwnd)) {
00067 uiTMFlags |= TM_INMENUMODE;
00068 }
else {
00069 uiTMFlags &= ~TM_INMENUMODE;
00070 }
00071
00072
00073
00074
00075 lParam = pmsg->lParam;
00076
00077
00078
00079
00080 uVirKey = LOWORD(pmsg->wParam);
00081
00082 cChar =
xxxInternalToUnicode(uVirKey,
00083 HIWORD(lParam),
00084 pti->
pq->
afKeyState,
00085 awch,
sizeof(awch)/
sizeof(awch[0]),
00086 uiTMFlags, &dwKeyFlags,
NULL);
00087 lParam |= (dwKeyFlags & ALTNUMPAD_BIT);
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
if (!cChar) {
00107
if (uiTMFlags & TM_POSTCHARBREAKS)
00108
return FALSE;
00109
else
00110
return TRUE;
00111 }
00112
00113
00114
00115
00116
00117
00118
if (cChar > 0)
00119 wMsgType = (fSysKey) ? (
UINT)WM_SYSCHAR : (
UINT)WM_CHAR;
00120
else {
00121 wMsgType = (fSysKey) ? (
UINT)WM_SYSDEADCHAR : (
UINT)WM_DEADCHAR;
00122 cChar = -cChar;
00123 }
00124
00125
if (dwKeyFlags & KBDBREAK) {
00126 lParam |= 0x80000000;
00127 }
else {
00128 lParam &= ~0x80000000;
00129 }
00130
00131
00132
00133
00134
00135 pwnd =
ValidateHwnd(pmsg->hwnd);
00136
if (!pwnd) {
00137
return FALSE;
00138 }
00139
00140
for (pwch = awch; cChar > 0; cChar--) {
00141
00142
00143
00144
00145
00146
_PostMessage(pwnd, wMsgType, (WPARAM)*pwch,
00147 lParam | (cChar > 1 ? FAKE_KEYSTROKE : 0));
00148
00149 *pwch = 0;
00150 pwch += 1;
00151 }
00152
00153
return TRUE;
00154 }
00155 }