C++执行导致监视器断开连接

问题描述:

我遇到的问题是执行此代码时,它会发出喀哒声,然后我的监视器变为蓝色,并显示“HDMI没有电缆连接”,并在1秒后恢复正常,或停留在该屏幕上,直到我执行一个操作(点击,等等)。C++执行导致监视器断开连接

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

#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社区。调试代码时以及运行可执行文件时会发生此问题。我的代码没有错误或警告。

+0

我在答案部分留下了更新,编辑我的帖子似乎不工作。 – luke

+0

你应该在问题中提供更新,而不是作为答案。答案框是答案。 –

+0

也许这只是你的系统告诉你的方式,是时候阅读[SendInput]的文档(https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx)。传递'1'作为第一个参数已经是一个bug了。另一方面,传递“真实”需要主动拒绝理解文档。然后由于使用未初始化的变量而导致未定义的行为。开始[这里](https://*.com/q/388242/1889329)。 – IInspectable

您没有正确初始化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)); 
+0

嘿,谢谢你的回复。 我试过用光标在Visual Studio和Google Chrome上。 – luke

+0

*“代码中没有任何内容表明导致这种行为的原因,除非您调用未定义的行为。”* - 代码清楚地说明了未定义的行为。 'INPUT Input;'当然不会初始化变量。使用(代码所做的)触发未定义的行为。 – IInspectable

+0

@luke确实在这个答案中建议的更改实际上解决您的问题? –

您并未初始化大部分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; 
+0

感谢您的信息,但它似乎没有修复它。 – luke

+5

以'INPUT Input = {};'开头,而不是。与你的方法相反,这保证了所有的字段实际上被归零 –