web-dev-qa-db-ja.com

Win32コンソールアプリケーションでのカーソル位置の設定

Win32コンソールアプリケーションでカーソル位置を設定するにはどうすればよいですか?できれば、ハンドルを作成したり、Windowsコンソール関数を使用したりしないようにします。 (私は午前中、その暗い路地を走り続けました。解決するよりも多くの問題を引き起こします。)stdioを使用して大学にいたとき、これを比較的簡単に行ったことを思い出しているようですが、今はその方法の例を見つけることができません。ご意見やご提案をいただければ幸いです。ありがとう。

さらなる詳細

これが私が今やろうとしていることです:

COORD pos = {x, y};
HANDLE hConsole_c = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL );
char * str = "Some Text\r\n";
DWDORD len = strlen(str);

SetConsoleCursorPosition(hConsole_c, pos);
WriteConsole(hConsole_c, str, len, &dwBytesWritten, NULL);
CloseHandle(hConsole_c)

テキスト文字列strが画面に送信されることはありません。他にやるべきことはありますか?ありがとう。

17
Jim Fell

参照 SetConsoleCursorPosition API

編集:

WriteConsoleOutputCharacter()を使用します。これは、コンソールでアクティブなバッファーへのハンドルを取得し、その位置を設定できるようにします。

int x = 5; int y = 6;
COORD pos = {x, y};
HANDLE hConsole_c = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
SetConsoleActiveScreenBuffer(hConsole_c);
char *str = "Some Text\r\n";
DWORD len = strlen(str);
DWORD dwBytesWritten = 0;
WriteConsoleOutputCharacter(hConsole_c, str, len, pos, &dwBytesWritten);
CloseHandle(hConsole_c);
12
cpx

コンソール関数を使用する場合は、SetConsoleCursorPositionを使用します。それらがない場合(または少なくとも直接使用しない場合)、 ncurses ライブラリでgotoxyのようなものを使用できます。

編集:それのラッパーはかなり簡単です:

// Untested, but simple enough it should at least be close to reality...
void gotoxy(int x, int y) { 
    COORD pos = {x, y};
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(output, pos);
}
14
Jerry Coffin

ええ、あなたはSetConsoleActiveScreenBufferに電話するのを忘れていました。自分でつくる意味は? GetStdHandle(STD_OUTPUT_HANDLE)を使用して、既存のコンソールへのハンドルを取得します。

4
Hans Passant
#include <windows.h>
#include <iostream.h>
using namespace std;
int main(int argc, char *argv[])
{
  int x,y;
  cin>>x>>y;
  SetCursorPos(x,y); //set your co-ordinate
  Sleep(500);
  mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0); // moving cursor leftdown
  mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0); // moving cursor leftup //for accessing your required co-ordinate
  system("pause");
  return EXIT_SUCCESS;
}
2
udit043

おそらく ANSI excape code sequence を使用していましたが、これはWindows 32ビットコンソールアプリケーションでは機能しません。

1
Mark Ransom