0

2 つのアプリケーション (ハード コーディングされたウィンドウ クラス atm) を循環する単純な W32 アプリケーションを作成しました。スタート ボタン (IDC_Start) を呼び出すと、すべて正常に動作しますが、フォーカスを hwnd に変更すると、アプリケーションがハングし、閉じることができません。IDC_Start を呼び出したときに開始されるループを停止するためのシンプルでクリーンなメソッドが必要なだけです。どんな助けでも大歓迎です!

#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);
 }
4

1 に答える 1