2013-05-04 25 views
0

我已經通過兩個應用程序(硬編碼窗口類atm)爲cicle創建了一個簡單的W32應用程序。 當我調用啓動按鈕(IDC_Start)時,一切正常,但是當我將焦點更改爲 hwnd應用程序掛起無法關閉。我只需要一個簡單而乾淨的方法來 停止循環,即在調用IDC_Start時啓動。任何幫助都會大大降低!Winapi C++:在打破循環時掛起DialogBox

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <windows.h> 
#include <resource.h> 
#include <iostream> 

using namespace std; 


BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 
{ 
HWND hwnd1,hwnd2; 
hwnd1 = FindWindow("Notepad++",0); 
hwnd2 = FindWindow("Notepad",0); 
BOOL bDone; 


switch(Message) 
{ 
    case WM_INITDIALOG: 
     // This is where we set up the dialog box, and initialise any   default values 
     { 
     SetDlgItemInt(hwnd, IDC_NUMBER, 5, FALSE); 

     HICON hIcon, hIconSm; 
     hIcon = (HICON)LoadImage(NULL, "e32.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE); 
     if(hIcon) 
     SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); 
     else 
     MessageBox(hwnd, "Could not load large icon!", "Error", MB_OK | MB_ICONERROR); 
     hIconSm = (HICON) LoadImage(NULL, "e16.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); 
     if(hIconSm) 
     SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm); 
     else 
     MessageBox(hwnd, "Could not load small icon!", "Error", MB_OK | MB_ICONERROR); 
     } 
    break; 
    case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     { 
      case IDC_START: 
      { 

       BOOL bSuccess; 
       int nDelay = GetDlgItemInt(hwnd, IDC_NUMBER, &bSuccess, FALSE); 
       nDelay= nDelay*1000; 
       int i=1; 
       ShowWindow(hwnd,SW_MINIMIZE); 
       if(bSuccess) 
       { 


       if (hwnd1 != 0&&hwnd2 != 0) 
          { 
          SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); 
           while(i) 
           { 
             if(bDone!=TRUE) 
             { 
           SetDlgItemInt(hwnd, IDC_SHOWCOUNT, nDelay/1000, FALSE); 
           Sleep(nDelay); 
           SetForegroundWindow(hwnd1); 
           Sleep(nDelay);  
           SetForegroundWindow(hwnd2); 
           i++;      
              }     
              else 
              {         
           SetThreadExecutionState(ES_CONTINUOUS); 
           MessageBox(hwnd, "Stopped", "Warning", MB_OK); 
           break; 
              } 
           } 
          } 
       else 
       { 
        MessageBox(hwnd,"Cannot find suitable Window","AppDia",MB_OK); 
       } 

       } 
       else 
       { 
        MessageBox(hwnd, "Number not identified", "Warning", MB_OK); 
       } 

      } 
      break; 

      case IDC_STOP: 
      bDone==TRUE; 
      break; 
     }   
    break; 
    case WM_CLOSE: 
     EndDialog(hwnd, 0); 
    break; 
    default: 
     return FALSE; 
} 
return TRUE; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow) 
{ 
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc); 
} 

回答

1

你的邏輯與Sleep小號循環,它並沒有給該對話框的方式來處理它的消息,因此它似乎掛 - 嘗試使用定時器來代替,喜歡的東西:

static BOOL bWnd1 = TRUE; 
case WM_COMMAND: 
    switch(LOWORD(wParam)) 
    { case IDC_START: 
     { int nDelay = GetDlgItemInt(hwnd, IDC_NUMBER, &bSuccess, FALSE); 
      nDelay= nDelay*1000; 
      ShowWindow(hwnd,SW_MINIMIZE); 
      SetTimer(hwnd, 1, nDelay, NULL); 
      break; 
     } 

     case IDC_STOP: 
      KillTimer(hwnd, 1); 
      break; 
    } 
    break; 

case WM_TIMER: 
{ HWND hwnd = (bWnd1 ? FindWindow("Notepad++",0) : FindWindow("Notepad",0)); 
    SetForegroundWindow(hwnd); 
    bWnd1 = !bWnd1; 
    break; 
} 

case WM_CLOSE: 
    KillTimer(hwnd, 1); 
    EndDialog(hwnd, 0); 
    break; 

default: 
    return FALSE; 

這只是一個示例代碼,您需要向其添加錯誤檢查...