Fiddle で MessageBox 表示

Ruby3.0から Win32API ライブラリが廃止になってしまったらしく 久々に Win32API使おうと思ったら使えなくて困った。 代替品として fiddle/import を使ってねということだったの使ってみた。

require "fiddle/import"
require 'fiddle/types'

def L(text)
  text.encode(Encoding::UTF_16LE)
end

module WIN32API
  extend Fiddle::Importer
  dlload 'C:\\Windows\\System32\\user32.dll'
  include Fiddle::Win32Types

  extern 'HWND GetForegroundWindow()'
  extern 'int MessageBoxW(HWND, const wchar_t*, const wchar_t*, UINT)'
end

hwnd = WIN32API.GetForegroundWindow
WIN32API.MessageBoxW(hwnd, L("こんにちわ"), L("hello"), 0)

MessageBoxWの第二引数、第三引数は LPCTSTR なんですが、Fiddle::Win32Types には定義されていないので Rubyが認識できる型で指定してあげる必要があります。LPCTSTR は const wchar_t* なのでそれで置き換えています。

また Rubyは文字列のエンコーディングがデフォルト UTF-8なのですが、wchar_t は UTF-16LE なので MessageBoxWに渡す前にエンコーディングの変更をしてあげる必要があります。

参考資料

qiita.com

news.mynavi.jp