【发布时间】:2014-09-10 00:00:17
【问题描述】:
大家好,我一直在尝试从 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("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;
}
【问题讨论】:
-
您正在为收到的每条消息创建一个线程?这似乎是个坏主意。
-
我需要它同时处理两件事情,但如果不把它放在循环中,我不知道该怎么做
-
没关系感谢@RetiredNinja 的帮助
-
为什么您的
Run函数采用HWND*而不是简单的HWND? -
我认为函数只能将指针指向一个窗口,因此它实际上可以使用,但我想不是