#! ruby
require 'win32ole'
wsh = WIN32OLE.new('WScript.Shell')
wsh.Popup("こんにちは",0, "タイトル")
#! ruby
require 'vr/vrdialog'
SWin::Application.messageBox("こんにちは" ,"タイトル",0)
require'win32ole'
sc=WIN32OLE.new("ScriptControl")
sc.language="VBScript"
a=sc.eval('InputBox("こんにちは"&vbcrlf&"入力してちょ","タイトル")')
sc.eval(%Q! MsgBox("#{a}",0,"タイトル") !)
#! ruby
require 'vr/vrdialog'
# ENTER,CANCELを使うためのおまじない
# そのうちにいらなくなるはず
module VRInputboxDialog
def msghandler(msg)
if msg.msg == WMsg::WM_INITDIALOG then
self.setItemTextOf(@options["target"],@options["default"].to_s)
end
if msg.msg == WMsg::WM_COMMAND then
if msg.wParam==@options["okbutton"] ||
msg.wParam==VRDialogComponent::IDOK then
close self.getItemTextOf(@options["target"])
elsif msg.wParam==@options["cancelbutton"] ||
msg.wParam==VRDialogComponent::IDCANCEL then
close false
end
end
end
end
tp=VRDialogTemplate.new
tp.move 150,100,200,60
tp.caption="タイトル"
tp.fontname="MS ゴシック"
tp.fontsize=10
okbtn = tp.addDlgControl VRButton,"OK",140,10,50,12,
WStyle::WS_TABSTOP
cancelbtn = tp.addDlgControl VRButton,"キャンセル",140,24,50,12,
WStyle::WS_TABSTOP
tgt = tp.addDlgControl(VREdit,"",4,40,185,12,
WStyle::WS_TABSTOP|WStyle::WS_BORDER)
tp.addDlgControl(VRStatic,"こんにちは\n入力してちょ",4,10,130,24)
options = {"okbutton"=>okbtn,"cancelbutton"=>cancelbtn,
"target"=>tgt ,"default"=>"ここにね"}
p st=VRLocalScreen.modalform(nil,nil,VRInputbox,tp.to_template,options)
SWin::Application.messageBox(st ? st : "" ,"入力は",0)
#! ruby
require 'vr/vrdialog'
class MyDialog < VRModalDialog
def construct
self.caption="タイトル"
@font = @screen.factory.newfont( "MS ゴシック",16 )
self.class::const_set("DEFAULT_FONT", @font)
move 400,200,400,160
style = WStyle::WS_TABSTOP
addControl VRStatic, "lbl", "こんにちは\n入力してちょ", 8,20,260,48
addControl VREdit, "edt", "ここにね",8,80,370,30,style | WStyle::WS_BORDER
addControl VRButton, "btnOK", "OK",280,20,100,24,style
addControl VRButton, "btnCancel", "キャンセル", 280,48,100,24,style
setButtonAs(@btnOK, IDOK)
setButtonAs(@btnCancel, IDCANCEL)
end
def btnOK_clicked
close(@edt.text)
end
def btnCancel_clicked
close(false)
end
end
p st=VRLocalScreen.modalform(nil,nil,MyDialog)
SWin::Application.messageBox(st ? st : "" ,"入力は",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
ライセンスの関係で「MSComDlg.CommonDialog」が使えない場合。
但し WindowsXP 限定。
#! ruby
require 'win32ole'
obj=WIN32OLE.new("UserAccounts.CommonDialog")
obj.Filter = "jww (*.jww)|*.jww|全て (*.*)|*.*|"
obj.InitialDir ='c:\jww'
obj.ShowOpen
file=obj.FileName
wsh = WIN32OLE.new('WScript.Shell')
if file==""
wsh.Popup("キャンセルされました",0, "error:")
else
wsh.Popup(file,0, "選択されたファイルは")
end
でも、やっぱり VisualuRuby がいいみたい。
openFilename の第6引数で初期ディレクトリを指定できる。
#! ruby
require 'win32ole'
require 'vr/vruby'
RFactory=SWin::LWFactory.new SWin::Application.hInstance
mw=RFactory.newwindow(nil)
mw.move(200,200,100,100)
mw.create
file= SWin::CommonDialog::
openFilename(mw,[["jww(*.jww)","*.jww"],
["all(*.*)","*.*"]],0x1000,
"ファイル選択",nil,"c:\\jww")
wsh = WIN32OLE.new('WScript.Shell')
if file
wsh.Popup(file,0, "選択されたファイルは")
else
wsh.Popup("キャンセルされました",0, "error:")
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"
生年月日から年齢を計算。
1993年2月24日は ruby の誕生日。
#! ruby
def age(birth,date=Date.today)
age=date.year-birth.year
(date>=birth>>12*age) ? age : age-1
end
puts "ruby は #{age(Date::new(1993,2,24))} 才"
#! 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)
2008/06/10 :第8版改訂
2008/06/03 :第7版改訂
2008/06/02 :第6版改訂
2007/09/30 :第5版改訂
2007/09/21 :第4版改訂
2007/09/15 :第3版改訂
2007/09/09 :第2版改訂
2007/09/05 :初版
| 戻る |