我一直试图制作一个垃圾邮件左键点击程序,因为我的朋友要求我在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:我成功了。但我仍然想知道制作一般垃圾邮件发送者的解决方法。
答案 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