Стандартная библиотека содержит модуль Fiddle::Importer позволяющий подойти более красиво к импортированию функций из ddl. Вам не придется прописывать сигнатуры функций, и вы сможите воспользоваться синтаксисом языка Си.

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
46
47
48
module Kernel32
  require 'fiddle/import'
  extend Fiddle::Importer  dlload 'Kernel32'
  extern 'int GetStdHandle(int)'
  extern 'void SetConsoleTextAttribute(int, int)'
  extern 'void SetConsoleCursorPosition(int, int)'
  extern 'int GetLargestConsoleWindowSize(int)'
  extern 'int GetConsoleOutputCP()'
end

class WinConsole

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

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

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

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

  # Возвращает кодовую страницу консоли
  # ret (Fixnum) - кодовая страница;
  def self.code_page
    Kernel32.GetConsoleOutputCP
  end

end

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