【问题标题】:C++ execution causes monitor to disconnectC++ 执行导致监视器断开连接
【发布时间】:2017-10-14 08:50:55
【问题描述】:

我遇到的问题是,在执行此代码时,它会单击,然后我的显示器变成蓝色并显示“HDMI 未连接电缆”,然后在 1 秒后恢复正常,或者停留在该屏幕上直到我执行一个操作(点击、alt 等)。

任何对为什么会发生这种情况有任何想法的人将不胜感激。

#include "stdafx.h"
#include <Windows.h>

using namespace std;

void function() {
    INPUT Input;
    Input.type = INPUT_MOUSE;
    Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    SendInput(true, &Input, sizeof(Input));
    Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(true, &Input, sizeof(Input));
};


int main()
{
    Sleep(3000);
    function();
    return 0;
}

另外,我正在使用 Visual Studio 2017 社区。调试代码和运行可执行文件时会出现此问题。我的代码没有错误或警告。

【问题讨论】:

  • 我已在答案部分对此进行了更新,编辑我的帖子似乎不起作用。
  • 您应该将更新放在问题中,而不是作为答案。答案框是用来回答问题的。
  • 也许这只是系统告诉您的方式,是时候阅读SendInput 的文档了。将1 作为第一个参数传递已经是一个错误。另一方面,通过true 需要主动拒绝理解文档。然后由于使用未初始化的变量,您有未定义的行为。开始here
  • @IInspectable 根据该文档传递1 是正确的,true 是等效的,因为存在从 bool 到 int 的隐式转换,真正映射到 1
  • @IInspectable 我阅读了整个页面,但没有看到您所说的错误。显然OP也没有。也许您可以尝试对您的cmets提供帮助而不是傲慢;或写一个涵盖该主题的答案?

标签: c++ winapi input visual-studio-2017 monitor


【解决方案1】:

您没有正确初始化INPUT 结构因此(可能)调用undefined behavior。使用以下方法将结构字段初始化为零:

INPUT Input = {};

您也可以使用包含两个元素的数组:

INPUT Input[2] = {0};

后跟一个:

Input[0].type = INPUT_MOUSE;
Input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
Input[1].type = INPUT_MOUSE;
Input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;

打一通SendInput:

SendInput(2, Input, sizeof(INPUT));

【讨论】:

  • 您好,谢谢您的回复。我已经尝试过将光标放在 Visual Studio 和 Google Chrome 上。
  • “除非您调用未定义的行为,否则您的代码中没有任何内容表明此类行为的原因。” - 代码清楚地说明了未定义的行为。 INPUT Input; 当然不会初始化变量。使用它(代码所做的)会触发未定义的行为。
  • @luke 做出这个答案中建议的更改真的解决了你的问题吗?
【解决方案2】:

您没有初始化大部分INPUT 字段,发送一些垃圾并可能触发未定义行为。您至少应该用零填充它们:

Input.type           = INPUT_MOUSE;
Input.mi.dx          = 0;
Input.mi.dy          = 0;
Input.mi.mouseData   = 0;
Input.mi.dwFlags     = MOUSEEVENTF_LEFTDOWN;
Input.mi.time        = 0;
Input.mi.dwExtraInfo = 0;

【讨论】:

  • 感谢您的信息,但它似乎没有修复它。
  • 改为以INPUT Input = {}; 开头。与您的方法相反,这可以保证所有字段实际上都归零
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多