C++ 在Windows 8.1中模拟按键

C++ 在Windows 8.1中模拟按键,c++,visual-c++,visual-studio-2013,windows-8.1,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;

我一直在尝试制作一个程序来垃圾邮件左键点击,因为我的朋友要求我在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;

}
#包括
#包括
#包括
使用名称空间std;
bool应该单击=false;
炭素;
int main()
{
输入ip;
ip.type=输入\鼠标;
ip.ki.wScan=0x01;//左键单击代码^^
ip.ki.time=0;
ip.ki.dwExtraInfo=0;
而(!应该单击)
{
cin>>中;
如果(in='g')
如果单击=true;
}
while(应该单击)
{
//按键
ip.ki.wVk=0x01;//鼠标左键单击的虚拟键代码
ip.ki.dwFlags=0;//0表示按键
SendInput(1,&ip,sizeof(INPUT));
//释放钥匙
ip.ki.dwFlags=MOUSEEVENTF_LEFTUP;//KEYEVENTF_KEYUP用于密钥释放
SendInput(1,&ip,sizeof(INPUT));
睡眠(100);
}
返回0;
}
当我启动程序并按g键时,Windows会逐渐变为黑色,然后进入屏幕保护程序,然后每隔100毫秒返回桌面。我只模拟了一次按键,它也这么做了(只模拟了一次)

有办法解决这个问题吗

PS:不,我不能在10秒内点击96次
PPS:我设法做到了。但我仍然想知道一个解决办法,使一般垃圾邮件发送者。

可用于实施恶意软件。ars在MSDN上评论道,这就是为什么它会受到影响。因此,只有在管理权限下运行,才能摆脱这种奇怪的行为

编辑:这有一节介绍UIPI以及如何赋予应用程序绕过它的权利。它不仅涉及以管理员身份运行代码,还涉及在可执行文件的清单中设置
UIAccess
属性,并使用有效证书对代码进行签名。

可用于实施恶意软件。ars在MSDN上评论道,这就是为什么它会受到影响。因此,只有在管理权限下运行,才能摆脱这种奇怪的行为

编辑:这有一节介绍UIPI以及如何赋予应用程序绕过它的权利。它不仅涉及以管理员身份运行代码,还涉及在可执行文件的清单中设置
UIAccess
属性,并使用有效证书对代码进行签名。

可用于实施恶意软件。ars在MSDN上评论道,这就是为什么它会受到影响。因此,只有在管理权限下运行,才能摆脱这种奇怪的行为

编辑:这有一节介绍UIPI以及如何赋予应用程序绕过它的权利。它不仅涉及以管理员身份运行代码,还涉及在可执行文件的清单中设置
UIAccess
属性,并使用有效证书对代码进行签名。

可用于实施恶意软件。ars在MSDN上评论道,这就是为什么它会受到影响。因此,只有在管理权限下运行,才能摆脱这种奇怪的行为


编辑:这有一节介绍UIPI以及如何赋予应用程序绕过它的权利。它不仅需要以管理员身份运行代码,还需要在可执行文件的清单中设置
UIAccess
属性,并使用有效证书对代码进行签名。

问题在于,您基本上是在向SendInput发送随机输入。随机输入->随机输出

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

如果您在union的mi版本之外设置输入结构,那么您应该获得合理的输入。您还需要同时向下和向上发射鼠标以获得完整的单击。通过设置输入结构数组,您可以在一次对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

问题在于,您基本上是在向SendInput发送随机输入。随机输入->随机输出

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

如果您在union的mi版本之外设置输入结构,那么您应该获得合理的输入。您还需要同时向下和向上发射鼠标以获得完整的单击。通过设置输入结构数组,您可以在一次对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

问题在于,您基本上是在向SendInput发送随机输入。随机输入->随机输出

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

如果您在union的mi版本之外设置输入结构,那么您应该获得合理的输入。您还需要同时向下和向上发射鼠标以获得完整的单击。通过设置输入结构数组,您可以在一次对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

问题在于,您基本上是在向SendInput发送随机输入。随机输入->随机输出

要发送鼠标输入,您需要使用input.mi(MOUSEINPUT)版本