2016-03-04 87 views
0

我給光標一些座標用下面的代碼:如何在控制檯窗口中找到光標的座標?

COORD c = { 7, 7 }; 
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
SetConsoleCursorPosition(h, c); 

現在我正在寫在屏幕上一些文字,我想知道光標的當前位置。

我發現用POINT,而不是COORD的唯一功能。所以我寫道:

VOID KeyEventProc(KEY_EVENT_RECORD ker) 
{ 
    POINT position; 
    GetCursorPos(&position); 

     if (position.y<14 && position.x<9){ 
      if (ker.bKeyDown) 
       printf("%c", ker.uChar); 
     } 

} 

POINT並沒有給出我需要的相同值。我如何轉換它?或者獲得當前COORD的功能是什麼?

+0

['GetCursorPos'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms648390(V = vs.85)的.aspx)是鼠標光標。文件很清楚。 –

+0

如果您閱讀「SetConsoleCursorPosition」的文檔,您就會知道答案。不要在不閱讀文檔的情況下調用API函數。 –

回答

2

作爲每對SetConsoleCursorPosition函數的文檔:

爲了確定光標的當前位置,使用GetConsoleScreenBufferInfo功能。

一般來說,如果您知道如何獲取或設置某些內容,該函數的MSDN文檔將暗示如何做相反的事情。在這種情況下確實如此。

如果我們仰望GetConsoleScreenBufferInfo功能,我們可以看到,我們已經達成paydirt。它填補了一個CONSOLE_SCREEN_BUFFER_INFO structure,除其他事項外,包含COORD結構,指示光標當前列和行座標。

甚至有an example。它打包成一個功能,如果你想讓它方便:

COORD GetConsoleCursorPosition(HANDLE hConsoleOutput) 
{ 
    CONSOLE_SCREEN_BUFFER_INFO cbsi; 
    if (GetConsoleScreenBufferInfo(hConsoleOutput, &cbsi)) 
    { 
     return cbsi.dwCursorPosition; 
    } 
    else 
    { 
     // The function failed. Call GetLastError() for details. 
     COORD invalid = { 0, 0 }; 
     return invalid; 
    } 
} 

正如邁克爾在評論已經提到,GetCursorPos不起作用,因爲它是爲鼠標光標(箭頭),而不是光標(插入點)在控制檯窗口中。它正在返回有效值,而不是您正在查找的值。幸運的是,退貨類型不同,否則它們很容易混淆。稱其爲「光標」的控制檯窗口是有點誤導,它可能應該叫插入符