[C++] 纯文本查看 复制代码
#include "stdafx.h"
/* 处理错误信息,将错误信息格式化为系统的默认语言输出 */
VOID ReportError (LPCTSTR userMessage, DWORD exitCode, BOOL printErrorMessage)
{
DWORD eMsglen;
DWORD errNum = GetLastError();
LPTSTR lpvSysMsg;
_ftprintf(stderr, _T("%s\n"), userMessage);
if (printErrorMessage) {
eMsglen = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errNum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpvSysMsg, 0, NULL);
if (eMsglen > 0) {
_ftprintf(stderr, _T("%s\n"), lpvSysMsg);
}else {
_ftprintf (stderr, _T("Last Error Number: %d.\n"), errNum);
}
if (lpvSysMsg != NULL)
LocalFree(lpvSysMsg);
}
if (exitCode > 0)
ExitProcess(exitCode);
return;
}
/*写消息到输出句柄*/
BOOL PrintStrings(HANDLE hOut, ...)
{
DWORD msgLen, count;
LPCTSTR pMsg;
va_list pMsgList; /*当前消息字符串*/
va_start (pMsgList, hOut); /*开始处理消息*/
while ((pMsg = va_arg(pMsgList, LPCTSTR)) != NULL) {
msgLen = _tcslen(pMsg);
/*先调用 WriteConsole() 若失败则调用 WriteFile(),两者都失败则返回 FALSE*/
if (!WriteConsole(hOut, pMsg, msgLen, &count, NULL) && !WriteFile(hOut, pMsg, msgLen * sizeof(TCHAR), &count, NULL)) {
va_end(pMsgList);
return FALSE;
}
}
va_end(pMsgList);
return TRUE;
}
/* 处理单条信息的 PrintStrings() 版本 */
BOOL PrintMsg(HANDLE hOut, LPCTSTR pMsg)
{
return PrintStrings(hOut, pMsg, NULL);
}
/* 在控制台中输出提示信息,在主函数中使用输入密码提示 */
BOOL ConsolePromt(LPCTSTR pPromptMsg, LPTSTR pResponse, DWORD maxChar, BOOL echo)
{
HANDLE hIn, hOut;
DWORD charIn, echoFlag, nOut;
BOOL success;
/* CONIN$ 为标准输入,获得标准输入句柄 */
hIn = CreateFile(_T("CONIN$"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
/* CONOUT$ 为标准输入,获得标准输出句柄 */
hOut = CreateFile(_T("CONOUT$"), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
/* 是否要让输入的内容回显,对于正式应用,输入的密码不会回显到屏幕上,如 SSH 连接 Linux 时输入密码的情况*/
echoFlag = echo ? ENABLE_ECHO_INPUT : 0;
/* 确保每一个函数要执行成功,分别设置控制台输入输出模式,最后用 ReadConsole() 读取屏幕缓冲区中用户输入的内容*/
success = SetConsoleMode (hIn, ENABLE_LINE_INPUT |echoFlag | ENABLE_PROCESSED_INPUT)
&& SetConsoleMode (hOut, ENABLE_WRAP_AT_EOL_OUTPUT | ENABLE_PROCESSED_OUTPUT)
&& PrintStrings (hOut, pPromptMsg, NULL)
&& ReadConsole (hIn, pResponse, maxChar - 2, &charIn, NULL);
if (success) {
pResponse[charIn - 2] = '\0'; /* 注意,这里移动到回车符处
* Windows 结尾使用 \n\r 回车换行表示起新的一行,其中 1 个元素的宽度为 2 个字节(Unicode表示)*/
if (!_tcscmp(pResponse, _T("groad.net"))) { /* 明码比较输入的密码 */
PrintStrings (hOut, _T("\n密码确认\n"), NULL);
}
else
PrintStrings (hOut, _T("错误,请输入正确的密码!\n"), NULL);
}
else
_ftprintf(stderr, _T("consolePrompt failure."));
CloseHandle(hIn);
CloseHandle(hOut);
return success;
}
int _tmain(int argc, _TCHAR* argv[])
{
_tsetlocale(LC_CTYPE, (LPCWSTR)"");
TCHAR pwdBuffer[1000];
ConsolePromt(_T("请输入你的密码: "), pwdBuffer, 1000, TRUE);
return 0;
}