在Windows 8.1中模拟按键

时间:2015-05-23 16:44:07

标签: c++ visual-c++ visual-studio-2013 windows-8.1

我一直试图制作一个垃圾邮件左键点击程序,因为我的朋友要求我在10秒内点击次数超过他。

这是我的代码:

#include <stdio.h>
#include <iostream>
#include <Windows.h>

using namespace std;

bool should_click = false;
char in;

int main()
{

    INPUT ip;

    ip.type = INPUT_MOUSE;
    ip.ki.wScan = 0x01; //code for left click ^.^
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;

    while (!should_click)
    {
        cin >> in;
        if (in == 'g')
            should_click = true;
    }
    while (should_click)
    {
        // Press the key
        ip.ki.wVk = 0x01; // virtual-key code for mouse left click
        ip.ki.dwFlags = 0; // 0 for key press
        SendInput(1, &ip, sizeof(INPUT));

        // Release the key
        ip.ki.dwFlags = MOUSEEVENTF_LEFTUP; // KEYEVENTF_KEYUP for key release
        SendInput(1, &ip, sizeof(INPUT));

        Sleep(100);
    }

    return 0;

}

当我启动程序并按g时,Windows淡化为黑色,然后淡入我的屏幕保护程序,然后每100毫秒返回桌面。我只用模拟按键一次尝试了这个,它做了同样的事情(只有一次)。

有解决方法吗?

PS:不,我在10秒内无法击败96次点击 PPS:我成功了。但我仍然想知道制作一般垃圾邮件发送者的解决方法。

2 个答案:

答案 0 :(得分:2)

SendInput()可用于实施恶意软件。这就是为什么,ars在MSDN上评论说,它受UIPI的约束。所以你只能通过运行管理权限来摆脱这种奇怪的行为。

编辑: MSDN article有一个关于UIPI的部分,以及如何为应用程序提供绕过它的权利。它不仅涉及以管理员身份运行代码,还涉及在可执行文件清单中设置UIAccess属性,并使用有效证书对代码进行签名。

答案 1 :(得分:1)

问题在于您基本上向SendInput发送随机输入。随机输入 - &gt;随机输出。

要发送鼠标输入,您需要使用INPUT联合的Input.mi(MOUSEINPUT)版本,而不是ki(KEYBOARDINPUT)版本。如果在设置输入结构后设置断点并查看ip.mi中的值,您可能会看到超出范围x和y以及无效的dwFlags。

如果你从联盟的mi版本设置INPUT结构,那么你应该得到合理的输入。您还需要向下发射鼠标和向上鼠标以完全点击。您可以通过设置INPUT结构数组在一次调用SendInput时执行此操作:

UINT click_at(int x, int y)
{
    INPUT ip[2] = { 0 };

    ip[0].type = INPUT_MOUSE;
    ip[0].mi.dx = x;
    ip[0].mi.dy = y;
    ip[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_MOVE;
    ip[1].type = INPUT_MOUSE;
    ip[1].mi.dx = x;
    ip[1].mi.dy = y;
    ip[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;

    return SendInput(ARRAYSIZE(ip), ip, sizeof(INPUT));
}

如果您只想点击鼠标所在的位置,而不是点击特定位置,请忽略MOUSEEVENTF_MOVE