Code:
#include <windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK NewEditProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInst;
WNDPROC OriginalEditProc;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR Args, int WinMode)
{
HWND hWnd;
MSG Message;
WNDCLASSEX Wcl;
hInst = hThisInst;
Wcl.cbSize = sizeof(WNDCLASSEX);
Wcl.hInstance = hThisInst;
Wcl.lpszClassName = "Window";
Wcl.lpfnWndProc = WindowFunc;
Wcl.style = 0;
Wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
Wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
Wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
Wcl.lpszMenuName = NULL;
Wcl.cbClsExtra = 0;
Wcl.cbWndExtra = 0;
Wcl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
if(!RegisterClassEx(&Wcl)) return 0;
hWnd = CreateWindow(
"Window",
"Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,
NULL,
hThisInst,
NULL
);
ShowWindow(hWnd, WinMode);
UpdateWindow(hWnd);
while(GetMessage(&Message, NULL, 0, 0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
static HWND hEditBox;
switch(Message)
{
case WM_CREATE:
hEditBox = CreateWindowEx(0,
"EDIT",
NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER,
10,
10,
300,
20,
hWnd,
(HMENU) 500,
hInst,
NULL);
OriginalEditProc = (WNDPROC) SetWindowLong(hEditBox,
GWL_WNDPROC,
(LONG) NewEditProc);
SetFocus(hEditBox);
break;
case WM_DESTROY:
SetWindowLong(hEditBox,
GWL_WNDPROC,
(LONG) OriginalEditProc);
DestroyWindow(hEditBox);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK NewEditProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
const int TAB = '\x09';
const int CR = '\x0d';
const int ESC = '\x1b';
if (Message == WM_CHAR)
{
if (wParam == TAB)
{
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) '<',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'T',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'A',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'B',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) '>',
lParam);
return 0;
}
else if (wParam == CR)
{
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) '<',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'C',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'R',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) '>',
lParam);
return 0;
}
else if (wParam == ESC)
{
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) '<',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'E',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'S',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) 'C',
lParam);
CallWindowProc(OriginalEditProc,
hWnd,
Message,
(WPARAM) '>',
lParam);
return 0;
}
}
return CallWindowProc(OriginalEditProc,
hWnd,
Message,
wParam,
lParam);
}