2017-10-14 90 views
0

我遇到的問題是執行此代碼時,它會發出喀噠聲,然後我的監視器變爲藍色,並顯示「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://stackoverflow.com/q/388242/1889329)。 – IInspectable

回答

-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)); 
+0

嘿,謝謝你的回覆。 我試過用光標在Visual Studio和Google Chrome上。 – luke

+0

*「代碼中沒有任何內容表明導致這種行爲的原因,除非您調用未定義的行爲。」* - 代碼清楚地說明了未定義的行爲。 'INPUT Input;'當然不會初始化變量。使用(代碼所做的)觸發未定義的行爲。 – IInspectable

+0

@luke確實在這個答案中建議的更改實際上解決您的問題? –

-1

您並未初始化大部分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 = {};'開頭,而不是。與你的方法相反,這保證了所有的字段實際上被歸零 –