【问题标题】:SendInput sending mouse input AND keyboard inputSendInput 发送鼠标输入和键盘输入
【发布时间】:2012-05-06 15:21:45
【问题描述】:

=)

我在 windows7 笔记本电脑上使用 C++(不是 VC++)。

我对这种从当前位置移动鼠标 x/y 的方法有疑问。每次它为鼠标事件调用发送输入时,它都会移动鼠标,但也会关闭我的屏幕(相当于 Fn+F2)。我调试了程序,发现不仅mi,而且kihi 都有值(这是针对x=25、y=25 和absolure=false):

    mi:
      dx            25
      dy            25  
      mouseData     0   
      dwFlags       1   
      time          2686400 
      dwExtraInfo   0   
    ki:
      wVk           25  
      wScan         0
      dwFlags       25  
      time          0   
      dwExtraInfo   1   
    hi:
      uMsg          25
      wParamL       25  
      wParamH       0       

我尝试将 ki 和 hi 设置为 0,但如果我这样做了,那么 mi 也会设置为 0,然后鼠标不会移动,但屏幕仍处于休眠状态! :$

以下是我使用的一些方法。

int Controller::mouse_move(long x, long y, bool absolute) {
   mouse.dx = x;
   mouse.dy = y;

   if (absolute) {
       mouse.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
   }else{
       mouse.dwFlags = MOUSEEVENTF_MOVE;
   }

   mouse.mouseData = 0;
   mouse.dwExtraInfo = 0;

   input.type = INPUT_MOUSE;
   input.mi = mouse;

   SendInput(1, &input, sizeof (input));

   return 0;
}

int Controller::mouse_move(long x, long y, bool absolute, int index_vector_no) {
    input.type = INPUT_MOUSE;
    input.mi.dx = x;
    input.mi.dy = y;

    if (absolute) {
        input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
    }else{
        input.mi.dwFlags = MOUSEEVENTF_MOVE;
    }

    input.mi.mouseData = 0;
    input.mi.dwExtraInfo = 0;

    input.ki.dwExtraInfo = 0;
    input.ki.dwFlags = 0;
    input.ki.time = 0;
    input.ki.wScan = 0;
    input.ki.wVk = 0;

    input.hi.uMsg = 0;
    input.hi.wParamH = 0;
    input.hi.wParamL = 0;

    SendInput(1, &input, sizeof (input));

    return 0;
}

谁能知道为什么这会发送键盘输入和鼠标?!只是和我的笔记本电脑配置有关吗?

提前致谢! =)

【问题讨论】:

  • 我猜他们可能是,但这并不能解释为什么它会关闭我的屏幕! :/ 类型标志设置为 INPUT_MOUSE 所以应该只用于鼠标事件!
  • 您是否将mi.time 设置为0?不这样做时,我得到了奇怪的结果。
  • 啊,谢谢!解决了它! :) windows 必须检查鼠标已经处于非活动状态的时间,并根据它使屏幕进入睡眠状态!如果您将其作为正确答案,我将选择它作为您的最佳答案! =)

标签: c++ keyboard mouse simulator sendinput


【解决方案1】:

其他人改变的原因是因为他们都在一个联合中,所以他们共享相同的内存。

关于屏幕关闭,你没有将mi.time设置为0,所以没有初始化。开始将这些结构初始化为 {0} 通常是个好主意,这样您就不会忘记事情。时间戳变成了某个随机数,可能会导致显示超时。

【讨论】:

  • 再次感谢,这真的让我很困惑! =)
【解决方案2】:

你可以用这个:

input.mi.time = 0;

之前:

input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;

它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2010-11-09
    • 2019-03-21
    • 2014-09-18
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多