关于之前 InputBox 的一些问题

0

我突然发现之前贴的代码贴的有问题,导致了你的误解,非常抱歉,我修改一下:

#include <easyx.h>

#define MAX_LOADSTRING 100
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	initgraph(640, 480);
	TCHAR str[MAX_LOADSTRING];
	InputBox(str, MAX_LOADSTRING, _T("请输入"), _T("请输入"));
	while (TRUE)
		if (GetKeyState(VK_ESCAPE) < 0)
			return 0;
}

我突然明白了你所说一瞬间可以命中的意思,才发现,我贴的代码没有循环,这才导致了你的误解。

我所发现的问题始终是主窗体对于ESC的响应,而不是输入框对ESC的响应,我发现的问题,也就是我所说的后遗症,指的是采用阻塞ESC按键的方式会使输入框关闭后主窗体的ESC也被阻塞。

要重现我的问题,请 注释/取消注释 InputBox 一行的代码,你会发现,当 InputBox 被注释掉,按下ESC程序会退出,当 InputBox 一行没有被注释掉,按下ESC键会在调试输出窗口输出类似于 
onecore\com\combase\dcomrem\channelb.cxx(6385)\combase.dll!76B8076E: (caller: 75025BB9) ReturnHr(1) tid(4734) 8001010E 应用程序调用一个已为另一线程整理的接口。
0x75B43DB2 (KernelBase.dll)处(位于 Project.exe 中)引发的异常: 0x8001010E: 应用程序调用一个已为另一线程整理的接口。
的信息。

ava
悲剧天下

2020-3-23

-1

1. 请补充下你的测试环境,例如:操作系统版本、VS 版本、EasyX 版本、是否安装 360 或腾讯管家等,以便我能准确重现你的问题。

  1. InputBox 里面按 ESC,与项目类型(控制台或 Win32)、后面是否加 GetKeyState 都没有关系,望知晓。所以,你可以试试看去掉后面的 GetKeyState,或者改用控制台程序,会不会有你遇到的问题?

3. 即便没有 InputBox,这里也不适合用 GetKeyState。请使用 GetAsyncKeyState。关于两者区别,请参考:https://devblogs.microsoft.com/oldnewthing/20041130-00/?p=37173

ava
慢羊羊

2020-3-23

所以我一直在强调,不是 InputBox 里按ESC!!!是主窗口里按ESC!!!为什么你总在说InputBox里按ESC呢? -  悲剧天下  2020-3-23
另外,我已经在问题描述中给出了重现问题的办法,我所说的“按下ESC程序会退出”以及之前所描述的问题说的都是在 InputBox 关闭之后的!!!是在 InputBox 关闭后,在主窗口按ESC会出现这样的问题。  -  悲剧天下  2020-3-23
@悲剧天下 请参考我回复你的第 3 点,GetKeyState 与 GetAsyncKeyState 的区别。在 main 里面,即便没有 InputBox,你用 GetKeyState 也是不妥的。 -  慢羊羊  2020-3-23
技术讨论社区