C++如何向指定程序写入鼠标事件,而不影响鼠标操作其他

想写一个游戏挂机插件,需要一直在游戏内长按鼠标左键来开枪,但不影响鼠标去游戏窗口外边干其他事,想问下大家,除了大漠插件,c语言里有没有原生支持此功能的方案,谢谢!

可以试试使用Windows操作系统提供的WinAPI函数SendInput用来模拟鼠标和键盘的输入事件,示例如下:

#include <windows.h>

void simulateMouseClick()
{
    INPUT input;
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    
    SendInput(1, &input, sizeof(INPUT));
    
    input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
    
    SendInput(1, &input, sizeof(INPUT));
}

int main()
{
    // 模拟鼠标点击事件,这里可以使用循环+延迟
    simulateMouseClick();

    return 0;
}
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7447028
  • 这篇博客你也可以参考下:C++ 实验二 NO.4 字符串合并:输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。
  • 除此之外, 这篇博客: 【C++代码】区间重叠问题中的 该题目也可描述为给出每件事情的开始时间和结束时间(都为整数),求最多有多少个事件同时发生?以下的讲解以这种时间的概念讲解(感觉更容易理解一些)。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •        
           
    输入输出用例:第一行为事件个数,从第二行开始,每行为一个事件的开始时间和结束时间,中间用空格隔开。
    5
    1         4
    1         2
    2         3
    3         4
    3         5
           
           

    方法一:
            求最多有多少个事件同时发生,那我们可以依次把每个时刻(都是整数)发生了多少个事件求出来,找出最大值,即为答案。
            如图,先求出t1时刻发生了多少事件,再求t2时刻发生了多少事件,再求t3时刻发生了多少事件,一直求到t4时刻发生了多少事件。
            求某一时刻发生了多少事件,需要遍历所有事件,判断事件的起始时间start和结束时间end是否满足:start<=t<end,若满足,则t时刻发生的事件数+1。
           
            时间复杂度度警告!!!这种方法时间复杂度非常高,一共有tmax个时刻,每个时刻遍历一遍所有事件判断该事件在当前时刻是否发生,O(tmax*n)的复杂度。

    C++代码:

    int main() {
        // 处理输入输出
        int n;
        cin >> n;
        vector<vector<int>> vec(n,vector<int> (2));  // 保存每个事件的起始时间和结束时间
        int max_en = 0;       // 保存最大的时间
        for (int i = 0; i < n; ++i) {       
            scanf("%d%d", &vec[i][0], &vec[i][1]);      
            max_en = max(max_en, vec[i][1]);
        }
        // 求每一时刻发生了多少事件
        int res = 0;
        for (int i = 1; i <= max_en; ++i) {
            int cur = 0;    // 保存时刻i发生的事件数量
            for (const auto &j : vec) {
                if (i >= j[0] && i < j[1]) {
                    ++cur;      // 如果该事件的起始时间和结束时间包含该时刻i,则事件数+1
                }
            }
            res = max(res, cur);  // 更新某时刻发生事件数量的最大值
        }
        cout << res;
    }
    

           
           
    方法二:
            可以额外建一个长度为tmax的数组,数组的每个元素代表当前时刻发生的事件个数,数组元素全部初始化为0。然后只需要遍历一遍所有事件,每遍历到一个事件,就把数组的该事件的start到end部分元素值+1,表示这段时间又多了一个事件发生。最后数组元素的最大值,就是同时发生最多事件的数量。
           
            时间复杂度警告!!!这种方法时间复杂度仍为O(n*tmax),但每个事件并不是从0~tmax都有值,而是只占了一小段时间,因此最优复杂度低一点,比上一种方法快一点。

    C++代码:

    int main() {
        // 处理输入输出
        int n;
        cin >> n;
        vector<vector<int>> vec(n, vector<int>(2));  // 保存每个事件的起始时间和结束时间
        int max_en = 0;       // 保存最大的时间
        for (int i = 0; i < n; ++i) {
            scanf("%d%d", &vec[i][0], &vec[i][1]);
            max_en = max(max_en, vec[i][1]);
        }
        
        vector<int> v(max_en + 1, 0);   // 额外建一个数组,保存每一时刻发生了多少事件
        for (const auto &j : vec) {
            for (int i = j[0]; i < j[1]; ++i) {
                ++v[i];
            }
        }
        auto res = max_element(v.begin(), v.end());
        cout << *res;
    }
    

           
           

           

    方法三:
            以上两种方法都比较好理解,但时间复杂度太高,还有别的方法,以后更新。

  • 您还可以看一下 夏曹俊老师的C++ 设计模式原理与实战大全-架构师需备课程课程中的 适配器模式的定义、场景与实用工程技术:对象适配与类的适配小节, 巩固相关知识点