2014-09-10 3 views
0

Привет всем Я пытался получить ввод из текстового окна редактирования Win32 так:Получение ввода от окна редактирования Win32 [C++]

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; 
} 
+1

Вы создаете поток для каждого получаемого сообщения? Это похоже на плохую идею. –

+0

Мне было нужно, чтобы он обрабатывал сразу две вещи, и я понятия не имел, как это сделать, не помещая его в цикл – AnonymousUser

+0

Nevermind Спасибо за помощь @RetiredNinja – AnonymousUser

ответ

0

Ничего себе, мои плохие парни, я положил startThread в контур сообщения, когда выбыл из отставной ниндзя, и это было причиной всех проблем.

+0

Это неправильно. Насквозь. Вы нарушаете правила нитей. Получите доступ к объектам пользовательского интерфейса из потока, создавшего окно. Здесь вам не нужны темы. Сделайте свою задачу, чтобы написать этот код без потоков. –

+0

Спасибо за совет, я сделаю это – AnonymousUser

Смежные вопросы