簡體   English   中英

使用 SendInput 或 mouse_event 不適用於 clock()?

[英]Using SendInput or mouse_event doesn't work with clock()?

void leftClick(){
    INPUT input[2];

    input[0].type = INPUT_MOUSE;
    input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    input[1].type = INPUT_MOUSE;
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;

    SendInput(2, input, sizeof(INPUT));
    cout<<"click down\n";
    cout<<"click up\n\n";

/*
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
*/
}

ReadProcessMemory(process, (void*)address, &value, sizeof(value), 0);
if (value == 1){
    if (clock() - click_time >= 500){
        cout<<"click time = "<< click_time <<endl;
        cout<<clock() - click_time <<endl;

        leftClick();

        click_time = clock();
    }
}

這給出了 output

click time = 0
57209
click down
click up

click time = 57222
501
click down
click up

click time = 57738
500
click down
click up

如您所見,點擊應該會發生,但這不會發送任何點擊。 只有當我拿出所有時鍾的東西時,它才會真正發出咔嗒聲。 如果我使用 mouse_event 而不是 SendInput,也會發生同樣的事情。

編輯:我在那里改變了 SendInput,沒有改變任何行為。 注釋的 mouse_events 也給出了相同的行為

編輯:似乎我無法制作一個最小的可重現示例。 如果沒有 ReadProcessMemory,它會延遲正常工作,它只是在讀取進程時不會延遲發送點擊。 研究將 ReadProcessMemory 與任何類型的延遲輸入相結合的問題。

目標進程/窗口可以檢測到 SendInput 並使用 LLMHF_INJECTED 標志阻止它。

如果它沒有阻塞輸入,您應該使用 MOUSEEVENTF_LEFTDOWN 發送一次輸入(),然后在延遲之后,您應該使用 MOUSEEVENTF_LEFTUP 再次調用它。 您不知道目標進程如何處理輸入,在幾種情況下添加延遲對我很有幫助。

這是一個用於 1 個延遲計時器的 usint std::chrono 示例,我在 DOWN 和 UP 之間使用了睡眠,以盡量不使解決方案過於復雜,而不是簡單的示例。

#include <chrono>
#include <thread>

int main()
{
    INPUT input{ 0 };
    input.type = INPUT_MOUSE;

    bool bClick = false;

    using Clock = std::chrono::steady_clock;
    std::chrono::time_point<std::chrono::steady_clock> start, now;
    std::chrono::milliseconds duration;

    start = Clock::now();

    while (true)
    {
        //toggles it on and off with one key
        if (GetAsyncKeyState('U') & 1)
            bClick = !bClick;

        if (bClick)
        {
            now = Clock::now();
            duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - start);

            if (duration.count() >= 100)
            {
                input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
                SendInput(1, &input, sizeof(INPUT));

                std::this_thread::sleep_for(std::chrono::milliseconds(30));

                input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
                SendInput(1, &input, sizeof(INPUT));
                start = std::chrono::steady_clock::now();
            }
        }
    }
    return 0;
}

您可以使用 U 鍵打開和關閉它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM