#! ruby
require 'win32ole'
wsh = WIN32OLE.new('WScript.Shell')
wsh.Popup("こんにちは",0, "タイトル")
require'win32ole'
sc=WIN32OLE.new("ScriptControl")
sc.language="VBScript"
a=sc.eval('InputBox("こんにちは"&vbcrlf&"入力してちょ","タイトル")')
sc.eval(%Q! MsgBox("#{a}",0,"タイトル") !)
簡単に済まそうと思うとこんな感じ。
#! ruby
require'win32ole'
require 'vr/vruby'
file=SWin::CommonDialog::
openFilename(nil,[["BAT(*.bat)","*.bat"],
["all(*.*)","*.*"]],0x1000)
wsh = WIN32OLE.new('WScript.Shell')
if file
wsh.Popup(file,0, "選択されたファイルは")
else
wsh.Popup("キャンセルされました",0, "error:")
end
位置が左上ではヤダという場合はダミーのウィンドウを準備してみよう。
#! ruby
require'win32ole'
require 'vr/vruby'
class MyForm < VRForm
def construct
col=SWin::CommonDialog::chooseColor(self)
wsh = WIN32OLE.new('WScript.Shell')
if col
wsh.Popup(col,0, "選択された色は")
else
wsh.Popup("キャンセルされました",0, "error:")
end
move 200,1200,0,0 # ダミーのウィンドウを隠す
end
end
VRLocalScreen.showForm(MyForm,200,200,0,0)
win32ole を使う方法を覚えた。
こちらの方が便利かも。
#! ruby
require 'win32ole'
obj=WIN32OLE.new("MSComDlg.CommonDialog")
obj.MaxFileSize =255
obj.Filter = "すべてのファイル (*.*)|*.*|"
obj.InitDir ="C:\\"
obj.ShowOpen
file=obj.FileName
wsh = WIN32OLE.new('WScript.Shell')
if file==""
wsh.Popup("キャンセルされました",0, "error:")
else
wsh.Popup(file,0, "選択されたファイルは")
end
win32ole で RegRead を使う。
#! ruby -Ks
require 'win32ole'
wsh = WIN32OLE.new('WScript.Shell')
zfile='HKEY_CURRENT_USER\Software\Jw_cad\jw_win\Folder\ZFILE'
ztemp = wsh.RegRead zfile
p ztemp
Win32/Registry を利用すればもっと柔軟。
#! ruby -Ks
require 'Win32/Registry'
Win32::Registry::HKEY_CURRENT_USER.
open('Software\Jw_cad\jw_win\Folder') do |reg|
type, value = reg.read('ZFILE')
p value
reg.each_value{|name, type, data| puts("#{name}=#{data}")}
end
Win32Utils を使うんだけど、いまのところテキストしか扱えないらしい。
#! ruby -Ks
require "win32/clipboard"
include Win32
p Clipboard.data
Clipboard.set_data("hoge")
p Clipboard.data
vruby の clipboard.rb で setText/getTextではなく、setData/getData を利
用するとテキスト以外にもいろんなデータに対応できるらしい。
BATファイルにして ruby -x でスクリプトを呼べばドラッグアンドドロップで
ファイルを処理できる。
ruby -Ks -x %~f0 %1 %2 %3 %4 %5 %6 %7 %8 %9
exit
#! ruby
require 'win32ole'
wsh = WIN32OLE.new('WScript.Shell')
wsh.Popup(ARGV.join("\n"),0, $0)
こんな感じのBATファイルはどうだろう。
jwwファイルをドラッグアンドドロップして使ってみる。
ruby -Ks -x %~f0 %1 %2 %3 %4 %5 %6 %7 %8 %9
exit
#! ruby
require 'win32ole'
wsh = WIN32OLE.new('WScript.Shell')
ARGV.sort.each{|argv|
if /\.jww$/i=~argv
memo=open(argv).read(100)[13,80].
scan(/(.*)\f/m).flatten[0]
wsh.Popup(memo,0,argv)
else
wsh.Popup("error:\njwwファイルではないようです",
0, argv)
end}
ファイルをエンコードするバッチファイル。
ruby -Ks -x %~f0 %1 %2 %3 %4 %5 %6 %7 %8 %9
exit
#! ruby
ARGV.each{|argv|
open(argv+".txt","w"){|e|
e.print [open(argv,"rb").read].pack("m")}}
ファイルのデコードするバッチファイル。
エンコードされたテキスト(txt)を元に戻す。
同名のファイルには上書きしない。
一応、エラーのログをとる。
ruby -Ks -x %~f0 %1 %2 %3 %4 %5 %6 %7 %8 %9
exit
#! ruby
$stderr=open(File.dirname(ARGV[0])+'\error.log',"w")
ARGV.each{|argv|
unless FileTest.file?(argv.sub(/\.te?xt$/i,""))
open(argv.sub(/\.te?xt$/i,""),"wb"){|e|
e.print open(argv).read.unpack("m")}
end}
jcode には reverse がないんだけど、
each_char.reverse.join で代用すればOK。
#! ruby -Ks
require 'jcode'
class String
def add_comma
return self.gsub(/([\-\+−+]?) # $1=>符号
([0-90-9]+) # $2=>整数部
((?:[\..][0-90-9]*)?)/x){|f| # $3=>小数部
a,b,c=$1,$2,$3
b=b.each_char.reverse.join.
gsub(/([0-90-9]{3})/,'\1,').
each_char.reverse.join.gsub(/^,/,"")
(a+b+c).gsub(/([0-9])\,/,'\1,')}
end
end
p "1234567.8901".add_comma # => "1,234,567.8901"
p "−12345".add_comma # => "−12,345"
#! ruby
require 'dl/win32'
mb = Win32API.new("user32","MessageBoxA",'LPPL',"L")
mb.call(0, "hoge", "title", 0)
電卓を起動してサイズやタイトルの変更。
#! ruby
require 'dl/win32'
Thread.start{system("calc")}
sleep 0.5
fw = Win32API.new('user32', 'FindWindow', 'LP', 'L')
hw = fw.call(0,'電卓')
mw = Win32API.new('user32', 'MoveWindow', ['L']*6, 'L')
mw.call(hw, 200, 200, 400, 300, 1)
swt=Win32API.new('user32', 'SetWindowText', 'LP', 'L')
swt.call(hw,"でんたく")
メモ帳を起動して「Hello World!」を入力してヘルプ起動。
文字はASCII文字コード表を参考に。
#! ruby
require 'dl/win32'
Thread.start{system("notepad")}
sleep 0.5
fw=Win32API.new('user32','FindWindow','PP','L')
fe=Win32API.new('user32','FindWindowEx','LLPP','L')
hw=fw.call(0,"無題 - メモ帳")
hw=fe.call(hw,0,"Edit",0)
sm= Win32API.new("user32", "SendMessage",['L']*4,'L')
[72,101,108,108,111,32,87,111,114,108,100,33,13].each{|e|
sm.call(hw,0x102,e,0)} #0x102:WM_CHAR
ke = Win32API.new('user32','keybd_event','IILL','V')
ke.call(0x12,0,0,0) #0x12:VK_MENU
ke.call(0x48,0,0,0) #0x48:VK_H
ke.call(0x12,0,2,0) #0x12:VK_MENU
ke.call(0x48,0,0,0) #0x48:VK_H
頭の「0x」は16進数を表す。
274 :WM_SYSCOMMAND
0xf140:SC_SCREENSAVE に相当。
#! ruby
require 'dl/win32'
getDesktopWindow = Win32API.new("user32", "GetDesktopWindow", [], 'L')
sendMessage = Win32API.new("user32", "SendMessage", ['L'] * 4, 'L')
sendMessage.Call getDesktopWindow.Call, 274, 0xf140, 0
ウィンドウのハンドルとクラス名、ウィンドウタイトルを列挙
out.log に書き出す
#! ruby
$stderr=open("error.log","w")
$stdout=open("out.log","w")
require 'dl/win32'
User32 = DL.dlopen("user32")
def get_window_text(hwnd)
buf = "\0" * 500
gWT = Win32API.new('user32','GetWindowTextA','LPI','I')
gWT.call(hwnd,buf, buf.size)
return buf.unpack("A*")[0]
end
def get_class_name(hwnd)
buf = "\0" * 500
gCN= Win32API.new('user32','GetClassName','LPI','I')
gCN.Call(hwnd,buf, buf.size)
return buf.unpack("A*")[0]
end
def puts_handle(hwnd)
puts hwnd.to_s+";"+get_class_name(hwnd)+
";"+get_window_text(hwnd)
end
# puts "===== EnumWindows ====="*2
# ew= User32['EnumWindows', '0PL']
# enum_windows_proc = DL.callback('IL'){|hwnd2|
# puts_handle(hwnd2); -1}
# ew.call(enum_windows_proc, 0)
# puts "=== EnumChildWindows ==="*2
hw=Win32API.new("user32","GetDesktopWindow",[],"L").call
ec= User32['EnumChildWindows', '0LPL']
enum_child_proc = DL.callback('IL'){|hwnd2|
puts_handle(hwnd2); -1}
ec.call(hw,enum_child_proc, 0)
2007/09/30 :第5版改訂
2007/09/21 :第4版改訂
2007/09/15 :第3版改訂
2007/09/09 :第2版改訂
2007/09/05 :初版
| 戻る |