Windows7 で管理者権限なしで font を追加する

最近、会社を変わったらPCの制限が厳しくて管理者権限がありません。そうなるとフォントも自由にインストールできません。

フォントやソフトウェアは作業性に大きく影響するので、管理者権限が無いなりにも、解決策を講じようと努力したメモです。私がやったのは、exerb に特化した部分を ocra 対応に手直ししただけです。ですので、以下は私自身のためのメモです。

基本的にWin32APIでフォントを追加します。これをrubyから実行させるということです。 Windows の管理者権限ないけどフォント追加し鯛 のコードそのままですが、ソースが複数のページにまたがっているので一つにまとめてあります。

ただし、オリジナルはexerbでexe化しているようですが、ocraではそのままで上手く動きません。

  myName   = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0

の部分を

  myName = ENV['OCRA_EXECUTABLE'] || $0

に変更します。(参考: ocra-1.2.0 Documentation , Ocraの豆知識 [環境変数:OCRA_EXECUTABLE 編] (巳2已己のメモ帳))。

これをocraでexe化して、個人的にフォントを格納してあるフォルダにコピーします。その状態からショートカットを作成して、スタートアップ(c:\Users\XXXX\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup XXXXはアカウント名)にそのショートカットをコピーか移動します。これでPC起動後ログインするとフォントが使用可能になります。

以下に完全なコードの写しを貼り付けておきます:

#!/usr/bin/ruby

require 'Win32API'

fontPath = String.new
# if font-path is not specified as an argument, use the path where this script resides
if ARGV.size != 0
  fontPath = ARGV.shift
else
  # retrieve my own name depends on whether I am .rb or .exe...
#  myName   = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0
  myName = ENV['OCRA_EXECUTABLE'] || $0
  fontPath = File.dirname(myName)
end

objAddFontResource = Win32API.new('GDI32.DLL', 'AddFontResource', %w(p), 'i')
text = String.new
Dir.chdir(fontPath) {
  Dir.glob("*.{fon,fnt,ttf,ttc,fot,otf}", File::FNM_CASEFOLD) {|entry|
    if /cygwin/ =~ RUBY_PLATFORM
      font = `cygpath -aw #{fontPath}/#{entry}`.chomp!
    else
      font = "#{fontPath}\\#{entry}"
    end
    if File.file?(font)
      ret = objAddFontResource.call(font)
      if ret != 0
        text << "%d font(s) added from #{entry}.\n" % ret
      else
        text << "adding #{entry} failed.\n"
      end
    end
  }
}

objMessageBox = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i') # args: window, text, caption, type
if text.size > 0
  objMessageBox.call(0, text, "#{myName}", 0) # MB_OK=0
else
  objMessageBox.call(0, "No font specified...", "#{myName}", 0) # type = MB_OK = 0
end

##########  font files with following extensions are added
## .fon
## .fnt
## .ttf
## .ttc
## .fot
## .otf

##########  font files with following extensions are not added
## .mmm
## .pfb
## .pfm