【问题标题】:Masking the user input as asterisks in Windows?在 Windows 中将用户输入屏蔽为星号?
【发布时间】:2019-10-26 13:32:23
【问题描述】:

我需要创建一个简单的密码程序,该程序要求用户输入密码,当用户输入时,它将字符显示为星号。

那里的每个教程都使用getch()(在conio.h)。但我不想使用它。这样做有什么简单的替代方法吗?

我使用的是 Windows 10。

P.S:请不要将其与此问题的重复混淆:Alternative function in iostream.h for getch() of conio.h?

因为该问题要求保留屏幕输出,而我需要将输入屏蔽为星号。

【问题讨论】:

  • @seccpur 嗯,这与我的问题无关。
  • 你不能用 C++ 标准库做到这一点,你需要平台特定的 API。那么,哪个操作系统?
  • 我使用的是 Windows 10
  • stackoverflow.com/questions/1413445/… 展示了如何让用户输入的内容静音。但是您想显示星形,这使这变得更加复杂。
  • @hyde 是的,谢谢你的链接。知道如何使回声类型静音很有用,但我仍然需要显示星号:(

标签: c++ windows console-application windows-console


【解决方案1】:

我们在这里提供非标准功能。所以,无论你做什么,它都不是便携的。

本机控制台方式是ReadConsoleInput(),如here 所述。在您的情况下,您将首先通过清除控制台模式标志ENABLE_LINE_INPUTENABLE_ECHO_INPUT 来禁用回显和行输入模式。然后,您将通过显示“*”对关键事件做出反应。最后不要忘记恢复初始控制台模式。

一个快捷方式是保存并更改控制台模式(如上面的代码所示),然后循环 cin.get() 并回显 cout<<'*'; 后跟 cout.flush(); 以确保输出不会在缓冲区中等待,给用户带来不适。

【讨论】:

  • 另外,“runas.exe”等程序调用CredUICmdLinePromptForCredentialsW。它直接打开“CONIN$”和“CONOUT$”,而不是使用标准句柄。标志CREDUI_FLAGS_EXCLUDE_CERTIFICATES 是必需的,您可能还需要CREDUI_FLAGS_DO_NOT_PERSIST。如果您已经拥有用户名,则可以将其作为pszTargetName(除了UserName)传递,而不是传递服务器名称,并结合标志CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS
  • 但是,CredUICmdLinePromptForCredentialsW 不会为键入的输入显示星号。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2012-02-22
  • 2019-07-13
  • 1970-01-01
  • 2021-11-25
  • 2018-02-15
相关资源
最近更新 更多