使用 _getwch() 获取中文输入时阻塞的问题

1
int main()
{
	initgraph(960, 640, EW_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	std::wstring str = L"";

	while (true)
	{
		if (_kbhit())
		{
			str += (TCHAR)_getwch();
		}		
	}

	return 0;
}

这段代码在获取中文输入时会进入阻塞状态,经过测试是卡在了 _getwch() 这里。

但是在获取英文输入时则不会

想做一个输入框控件,有别的办法吗?

ava
慢热友人

2021-4-26

0

控制台的中文输入问题

这是控制台本来就存在的问题。

以下代码是纯粹的控制台程序,没有使用 EasyX,你可以测试一下,同样会存在你遇到的问题:

// 编译环境:Win10,VC2019
//
#include <Windows.h>
#include <conio.h>
#include <stdio.h>

int main()
{
	wchar_t c;

	while (true)
	{
		if (_kbhit())
		{
			c = _getwch();	//_getch() 也会产生你遇到的问题
			printf("[%c]", c);
		}

		printf(".");
		Sleep(100);
	}

	return 0;
}

EasyX 的中文输入方案

如果要在 EasyX 中处理中文输入,使用 getmessage / peekmessage 获取字符消息即可,可以完美支持中文。参考以下代码:

// 编译环境:VC2019,EasyX_20210719
//
#include <graphics.h>
#include <stdio.h>

int main()
{
	initgraph(640, 480);

	int x = 0, y = 20;	// 自动画圆的坐标

	TCHAR s[100];		// 获取到的字符
	int si = 0;			// 字符存储位置

	ExMessage msg;		// 消息

	while (true)
	{
		while (peekmessage(&msg))
		{
			if (msg.message == WM_CHAR)
			{
				s[si] = msg.ch;
				s[si + 1] = 0;
				outtextxy(0, si * 12 % 470, s);
				si = (si + 1) % 98;
			}
		}

		x += 2;
		if (x >= 640)
		{
			x = 0; y += 20;
		}
		circle(x, y, 5);

		Sleep(20);
	}

	return 0;
}
ava
慢羊羊

2021-4-28

技术讨论社区