使用C ++在特定时间打开链接

问题描述 投票:0回答:1

因此,我试图编写一个C ++控制台程序,该程序在特定时间打开与Web浏览器的链接。时钟更新正常,shell行打开了链接,但是我无法让这两者一起工作。这是我的代码:

#include <Windows.h>
#include <shellapi.h>
#include <ctime>
#include <chrono>
#include <thread>

using namespace std;

int main(int argc, char* argv[])
{
string url = "https://www.google.com";

while (true) {
    system("cls");
    time_t now = time(0);
    char* dt = ctime(&now);

    cout << dt;
    while (dt == "Mon May 18 09:48:00 2020") {
        ShellExecute(NULL, "open", url.c_str(),
            NULL, NULL, SW_SHOWNORMAL);
    }

    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
return 0;
}
c++ url time hyperlink console
1个回答
1
投票

至少对我来说,您的代码似乎有些混乱。目前尚不清楚为什么我们一次要睡一秒钟直到达到目标。更糟糕的是,如果其中一个睡眠呼叫发生时间太长,我们可能会超标,而永远不会执行所需的操作。更糟糕的是,如果我们确实达到了所需的时间,那么内循环看起来就像是一个无限循环,因为只要字符串具有所需的时间,内循环就将继续执行-但我们不会将字符串更新为当前时间,因此如果我们确实打了那个时间,字符串将永远保持不变。

至少根据您的描述,我们只想选择一个时间,睡到那时,然后执行命令。为此,看起来像这样的通用命令代码就足够了:

#include <windows.h>
#include <chrono>
#include <thread>
#include <iostream>

int main() {
    // For the moment, I'm just going to pick a time 10 seconds into the future:
    time_t now = time(nullptr);    
    now += 10;

    // compute that as a time_point, then sleep until then:
    auto then = std::chrono::system_clock::from_time_t(now);
    std::this_thread::sleep_until(then);

    // and carry out the command:
    ShellExecute(NULL, "open", "https://www.google.com",
        NULL, NULL, SW_SHOWNORMAL);
}

根据您的情况,您显然希望指定数据和时间。测试起来有点困难,但是从根本上来说并没有太大的不同。您可以将所需的日期/时间填充到struct tm中,然后使用mktime将其转换为time_t。一旦有了time_t,就可以像上面的代码一样使用std::chrono::system_clock::from_time_t,然后从那里继续。如果需要从字符串开始,则可以使用std::get_time将字符串数据转换为struct tm。因此,对于您指定的日期/时间,我们可以执行以下操作:

#include <windows.h>
#include <chrono>
#include <thread>
#include <iostream>
#include <sstream>
#include <iomanip>

auto convert(std::string const &s) {
    std::istringstream buffer(s);

    struct tm target_tm;
    buffer >> std::get_time(&target_tm, "%a %b %d %H:%M:%S %Y");
    time_t target = mktime(&target_tm);
    return std::chrono::system_clock::from_time_t(target);
}

int main() {
    auto target = convert("Mon May 18 09:48:00 2020");

    std::this_thread::sleep_until(target);
    ShellExecute(NULL, "open", "https://www.google.com",
        NULL, NULL, SW_SHOWNORMAL);
}
© www.soinside.com 2019 - 2024. All rights reserved.