从Win32编辑框[C++]获取输入
您好,我一直在尝试从Win32文本编辑框获取输入,如下所示:从Win32编辑框[C++]获取输入,c++,winapi,C++,Winapi,您好,我一直在尝试从Win32文本编辑框获取输入,如下所示: char IP_ADDR[200]; char NICK[200]; #define Print(msg) print_line(*hwnd, msg) #define Println() Print("\r\n") Print("Welcome to Basic Client 0.01 Alpha!"); Println(); Print("Plea
char IP_ADDR[200];
char NICK[200];
#define Print(msg) print_line(*hwnd, msg)
#define Println() Print("\r\n")
Print("Welcome to Basic Client 0.01 Alpha!");
Println();
Print("Please enter your IP address");
Println();
for (;; Sleep(500))
{
if (IsKeyDown(VK_RETURN))
{
GetDlgItemText(*hwnd, IDC_MAIN_EDIT2, IP_ADDR, sizeof(IP_ADDR));
SetDlgItemText(*hwnd, IDC_MAIN_EDIT2, "");
break;
}
}
Print("Please enter a nickname");
Println();
for (;; Sleep(500))
{
if (IsKeyDown(VK_RETURN))
{
GetDlgItemText(*hwnd, IDC_MAIN_EDIT2, NICK, sizeof(NICK));
SetDlgItemText(*hwnd, IDC_MAIN_EDIT2, "");
break;
}
}
但这不会进入循环或停止循环,直到按下键。如果有帮助,它会继续运行,这是新线程中的运行函数代码,因此它可以在管理窗口消息时执行此操作。下面是代码:
Client * c = new Client;
.....
int Run(HWND *hwnd)
{
MSG msg = { 0 };
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
_beginthreadex(0, 0, ClientThread, (void*)hwnd, 0, 0);
}
}
return 1;
}
unsigned int __stdcall ClientThread(void*data)
{
HWND *hwnd = (HWND*)data;
c->Run(hwnd);
return 0;
}
下面是IsKeyDown函数:
bool Client::IsKeyDown(int vk)
{
return ((GetAsyncKeyState(vk) & 0x1) != 0)? true:false;
}
哇,我的坏蛋,我把beginThread放在了消息循环中,正如退休的忍者所指出的,这就是造成所有问题的原因。你为收到的每条消息都创建了一个线程?这似乎是个坏主意。我需要它同时处理两件事,但我不知道如何在不将它放入循环的情况下做到这一点。无需感谢@RetiredInjaw的帮助。为什么运行函数需要HWND*而不是简单的HWND?我想函数只能获取指向窗口的指针,这样它才能实际使用,但我想不是这样错误的完全地你正在违反线程规则。从创建窗口的线程访问UI对象。这里不需要线程。把写这段没有线程的代码作为你的目标。谢谢你的建议,我会去做的