Можно много говорить о возможностях языка, о его красоте, но ни что не дает такого удовлетворения как расширяемость своими руками. Хотите расширить функционал ruby или ускорить часть реализованного кода? Тогда стандартная библиотека fiddle для Вас. Подключаем, описываем API функции заложенные в dll файлах и пользуемся. Сделав красивую обертку с наслаждением используем в своих проектах и радуемся созданному функционалу. Данная библиотека позволяет не только вызывать внешние функции, но так же работать с выделением памяти в куче. Вызываем API функции для работы с консолью.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
require 'fiddle'

class WinConsole
  Kernel32 = Fiddle.dlopen('Kernel32')
  GetStdHandle = Fiddle::Function.new(Kernel32['GetStdHandle'], [Fiddle::TYPE_INT], Fiddle::TYPE_INT)
  GetConsoleOutputCP = Fiddle::Function.new(Kernel32['GetConsoleOutputCP'], [], Fiddle::TYPE_INT)
  SetConsoleTextAttribute = Fiddle::Function.new(Kernel32['SetConsoleTextAttribute'], [Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_VOID)
  SetConsoleCursorPosition = Fiddle::Function.new(Kernel32['SetConsoleCursorPosition'], [Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_VOID)
  GetLargestConsoleWindowSize = Fiddle::Function.new(Kernel32['GetLargestConsoleWindowSize'], [Fiddle::TYPE_INT], Fiddle::TYPE_INT)

  STD_INPUT_HANDLE = GetStdHandle.call(-10)
  STD_OUTPUT_HANDLE = GetStdHandle.call(-11)
  STD_ERROR_HANDLE = GetStdHandle.call(-12)

  # Устанавливает цвета консоли
  # c (Fixnum) - цвет;
  # b (Fixnum) - фон;
  def self.color(c, b)
    SetConsoleTextAttribute.call STD_OUTPUT_HANDLE, (b << 4) + c
  end

  # Устанавливает курсор в нужную позицию
  # x (Fixnum) - координата X;
  # y (Fixnum) - координата Y;
  def self.locate(x, y)
    SetConsoleCursorPosition.call STD_OUTPUT_HANDLE, (y << 16) + x
  end

  # Возвращает размер самого большого возможного окна консоли
  # ret ([Fixnum, Fixnum]) - длинна и ширина;
  def self.max_window
    result = GetLargestConsoleWindowSize.call STD_OUTPUT_HANDLE
    return result & 0xFF, result >> 16
  end
  # Возвращает кодовую страницу консоли
  # ret (Fixnum) - кодовая страница
  def self.code_page
    GetConsoleOutputCP.call
  end
end

WinConsole.locate 10, 5
WinConsole.color 4, 9
p WinConsole.max_window
p WinConsole.code_page