坚持做一个while循环

时间:2016-07-01 03:57:18

标签: c++ loops while-loop

大家好,所以这是我的问题,因为我被困在这段代码中超过2天

我想让我的程序监视器成为一个特殊的应用程序并等待它午餐我尝试了“Do and While循环”,但它不起作用我已检查并重新检查,我无法找到解决此问题的方法

        HWND hwnd = FindWindow(0,("my programme window name")); 

        do {
        if(hwnd == nullptr ) {            /* if the window has not beign found */
        cout << "window not found!" << endl;
        Sleep(1000);
        system("cls");
        }
       }while(hwnd == nullptr);

  /*******************************************************************/

 starting the next code once the window of the programe has been found

所以我的问题是我不断找到“”窗口未找到!“当我首先启动我自己的程序然后午餐程序希望我尝试监控,但是当我启动程序时我希望监控然后我启动自己的程序程序一切正常

为你提供帮助---编辑问题解决

7 个答案:

答案 0 :(得分:5)

您没有在循环中更改hwnd。您需要在循环中调用FindWindow()。您可以使用常规while循环代替do-while,因此您无需再进行两次调用。

while ((hwnd = FindWindow(0, "my programme window name")) == nullptr) {
    cout << "window not found!" << endl;
    Sleep(1000);
    system("cls");
}

答案 1 :(得分:1)

循环中的任何内容都不会更改hwnd,因此无法摆脱循环(如您所见)。

您需要在循环内部更改hwnd,以便(最终)hwnd可能不会== nullptr。例如hwnd = FindWindow(0,("my programme window name"));

我会重构:

HWND hwnd = FindWindow(0,("my programme window name")); 
while(hwnd == nullptr)
{
    cout << "window not found!" << endl;
    Sleep(1000);
    system("cls");
    hwnd = FindWindow(0,("my programme window name")); 
}

答案 2 :(得分:1)

假设进入循环时hwnd的值为nullptr;你没有在循环中改变它的值。由于条件hwnd == nullptr始终为真,因此您将获得无限循环。

为了解决此问题,您需要更改循环中hwnd的值。

答案 3 :(得分:1)

首先要做的事:投票是错误的。

如果您需要被告知已创建某个窗口,请使用专门为此定制的工具。设置监听WinEvents个事件的SetWinEventHook挂钩(调用EVENT_OBJECT_CREATE)。在WinEventProc回调中,您可以通过检查窗口标题,窗口类别,某些样式(及其组合)来过滤掉您感兴趣的窗口。

这并不会浪费资源,例如你每秒都要进行一次投票,也不会出现竞争条件(例如因为它是在采样点之间创建和销毁而丢失了一个窗口)。

答案 4 :(得分:-1)

我建议您按以下方式实现do-while循环:

hwnd

现在循环检查nullptr的值,如果它等于F11 key,它进入循环,输出错误消息,等待一秒,清除屏幕,并重新检查是否存在指定窗口的。

顺便说一句,许多IDE都有一个功能(在MSVC中称为“Step Into”),跟踪程序的执行。您可以使用此功能查看运行时问题所在。只需构建解决方案(不要运行它)并按<header> <div class="container"> <img class="logo" src="" alt="lol"> <form class="login-form"> <input type="text" placeholder="Email Adress"> <input type="password" placeholder="Password"> <button type="submit" class="btn btn-primary">Login</button> <br> <input type="checkbox" name="remember"><span style="color:#FFF">Remember me</span> <div class="login-options"> <ul> <li><a href="#">Reg</a></li> <li><a href="#">Forgot pass?</a></li> </ul> </div> </form> </div> <div class="navbar"> <div class="container"> <ul> <li><a href="#">!!</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> <li><a href="#">Contact</a></li> </ul> </div> </div> </header> <!--end of header--> (在MSVC中 - 不知道其余的)以使用此功能。

答案 5 :(得分:-2)

HWND是指向Windows内部数据结构的指针。它仅在创建窗口后可用。所以你应该查看窗口,直到它没有返回所需的句柄。 Barmar提供了一种非常简洁的方式来执行此检查。

找到窗口后,您应该打开while循环。也许这可能就是为什么你的后续逻辑似乎没有被调用的原因。

另外,您是否在主线程中执行此代码?如果是,您是否有必要使用睡眠?我建议您使用WM_TIMER事件 - 这样主线程可以自由处理其他系统事件并且不会休眠。

答案 6 :(得分:-2)

我认为问题是&#34; FindWindow(0,(&#34;我的程序窗口名称&#34;))&#34;无法返回可用的hwnd,因此循环被卡住了。

如果hwnd仍为null,可能会尝试10次,打破循环或退出程序。

sensorManager.registerSensor(this, accelerometer, 62500)