如何在C#控制台应用程序中获取光标处的字符?

时间:2012-03-20 15:55:40

标签: c# console cursor

我知道如何使用 SetCursorPosition CursorLeft CursorTop 设置到控制台中的特定点>一起。这不是问题。

但是,我怎样才能获得该点的价值?是不是像 Console.Cursor 这样的东西?所以我可以在那个位置得到角色?也许是这样的:

char c = Console.GetCharAtCursor();

没有运气?

3 个答案:

答案 0 :(得分:4)

AFAIK,您必须将整个控制台缓冲区作为二维缓冲区读取,并使用光标的X和Y坐标作为该缓冲区的索引。参见:

[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool GetConsoleScreenBufferInfo(
    IntPtr consoleHandle,
    out CONSOLE_SCREEN_BUFFER_INFO consoleScreenBufferInfo);

您可以在此处阅读缓冲区结构:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093(v=vs.85).aspx

<强>更新

如果您对使用控制台API进行游戏编写感兴趣,有人会为控制台编写空间入侵者(实际上是powershell),但所有API都是托管代码,而不是脚本。他有精灵/路径例程等 - 来源在http://ps1.soapyfrog.com/2007/08/26/grrr-source-code-including-invaders/

结束

答案 1 :(得分:1)

'CursorLeft'和'CursorTop'有吸气剂,所以你可以阅读它们:var cleft = Console.CursorLeft

答案 2 :(得分:0)

我不喜欢这里为我的简单应用程序发布的冗长答案,因此我想出了一种解决方法–我将整个控制台缓冲区存储在2D数组中,然后在该数组中建立索引。为我的应用程序工作(在控制台中生成冰柱):

class SearchResultsListView(ListView): #new
model = Article
context_object_name = 'article_list'
template_name = 'search_results.html'
def get_queryset(self):
   query =self.request.GET.get('q')
   card_dict = Card.objects.values('card_type').get(card_name=query)
   results = Article.objects.filter(
    Q(cardvar__card_name__iexact=query) | 
   (Q(cardvar__card_type=card_dict['card_type']) & 
   ~Q(score=0))
   ).order_by('cardvar', '-entry_date_time')
    return results