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に渡す前にエンコーディングの変更をしてあげる必要があります。