READCHAR.C


/******************************************************************************\
* This is a part of the Microsoft Source Code Samples.
* Copyright 1993 - 1998 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/

#include <windows.h>
#include <string.h>
#include <malloc.h>
#include "console.h"

/*********************************************************************
* FUNCTION: demoReadConChar(HANDLE hConOut) *
* *
* PURPOSE: demonstrate ReadConsoleOutputCharacter. Read the text on *
* line that the user clicks on and output it to the console *
* *
* INPUT: the console output handle to write to *
*********************************************************************/

void demoReadConChar(HANDLE hConOut)
{
BOOL bSuccess;
INPUT_RECORD inputBuffer;
DWORD dwStdInMode;
HANDLE hStdIn;
DWORD dwInputEvents;
COORD coordLine; /* coordinates of where to read characters from */
CHAR *szLine; /* buffer to hold the line read from the console */
DWORD dwCharsRead;
int i;

setConTitle(__FILE__);
myPuts(hConOut, "Click on any line containing characters. I will use\n"
"ReadConsoleOutputCharacter to read that line of text into\n"
"a buffer, then print that buffer to the console at the\n"
"current cursor position. Hit ESC to return.\n\n");
hStdIn = GetStdHandle(STD_INPUT_HANDLE);
PERR(hStdIn != INVALID_HANDLE_VALUE, "GetStdHandle");
/* save the console mode */
bSuccess = GetConsoleMode(hStdIn, &dwStdInMode);
PERR(bSuccess, "GetConsoleMode");
/* enable mouse input */
bSuccess = SetConsoleMode(hStdIn, dwStdInMode | ENABLE_MOUSE_INPUT);
PERR(bSuccess, "SetConsoleMode");
/* allocate space for one line */
szLine = (char *) malloc(getConX(hConOut));
PERR(szLine, "malloc");
for(;;)
{
/* get a single input event */
bSuccess = ReadConsoleInput(hStdIn, &inputBuffer, 1, &dwInputEvents);
PERR(bSuccess, "ReadConsoleInput");
switch (inputBuffer.EventType)
{
case KEY_EVENT:
/* is it an ESC key? */
if (inputBuffer.Event.KeyEvent.bKeyDown &&
inputBuffer.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
{
/* set input mode back to what it was originally and return */
bSuccess = SetConsoleMode(hStdIn, dwStdInMode);
PERR(bSuccess, "SetConsoleMode");
free(szLine); /* free allocated space for a text line */
return;
}
break;
case MOUSE_EVENT:
/* was this was a click event? Is any button down or not? */
if (inputBuffer.Event.MouseEvent.dwEventFlags != MOUSE_MOVED &&
inputBuffer.Event.MouseEvent.dwButtonState)
{
/* read the line where the mouse is, starting at column 0 */
coordLine.X = 0;
coordLine.Y = inputBuffer.Event.MouseEvent.dwMousePosition.Y;
bSuccess = ReadConsoleOutputCharacter(hConOut, szLine,
getConX(hConOut), coordLine, &dwCharsRead);
PERR(bSuccess, "ReadConsoleOutputCharacter");
/* strip trailing spaces */
i = getConX(hConOut) - 1;
szLine[i--] = 0; /* null terminate */
while (szLine[i] == ' ')
szLine[i--] = 0;
myPuts(hConOut, szLine);
}
} /* switch */
} /* while */
}