Written in C, but could be easily adapted to return std::string and such:
Code:
char *getPass(char *szBuffer, size_t len)
{
size_t i;
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwOld, dwNumRead, dwNumWritten;
if((hIn != INVALID_HANDLE_VALUE) && (hOut != INVALID_HANDLE_VALUE))
{
if(GetConsoleMode(hIn,&dwOld))
{
if(SetConsoleMode(hIn,ENABLE_PROCESSED_INPUT))
{
for(i=0;i<len-1;i++)
{
if(ReadConsole(hIn,&szBuffer[i],1,&dwNumRead,NULL))
{
if(szBuffer[i] == '\r')
{
break;
}
else WriteConsole(hOut,"*",1,&dwNumWritten,NULL);
}
else break;
}
WriteConsole(hOut,"\n",1,&dwNumWritten,NULL);
szBuffer[i] = '\0';
SetConsoleMode(hIn,dwOld);
return szBuffer;
}
}
}
return NULL;
}