WindowsManagerの使い方
 
 #contents
 
 *インタプリタ [#g865df8e]
 WindowsManagerを起動した状態で,Ctrl+Alt+Dを押すと,以下のような画面が出るはずです.~
 #ref(./wmscm.PNG);
 この画面上では,Schemeというプログラミング言語の命令を評価(実行)する事ができます.~
 1+2や,変数の定義などもできます.
 #ref(./wmscm_eval.PNG);
 このように,WindowsManagerでは,評価の結果が画面に表示されます.~
 また,Schemeは多くの有名な大学のプログラミング入門等にも使われている言語です.~
 プログラミングを知らない方や,Schemeを知らない方でも,簡単に覚えれます.~
 [[もうひとつのScheme入門>http://www.shido.info/lisp/idx_scm.html]]が入門に向いていると思います.
 
 適当に,加減乗除でもしてみてください.ちょっと高機能な電卓としても使えますね.
 
 
 *設定 [#m139666d]
 system.scmが起動時に読み込まれます.設定を変更する際は,system.scmからloadされる,user.scmを編集すると良いです.~
 WindowsManager起動中にuser.scmを更新した場合は,インタプリタ上で
  (load "user.scm")
 とすれば,設定が更新されます.
 
 *キーバインドの設定 [#l5f709be]
 よく使う機能はインタプリタ上で入力することなく,ショートカットキーで呼び出せるようにすると便利です.~
 set-key関数を使うことで,ショートカットキーを割り当てる事ができます.~
 set-key関数は
  (set-key メタキー 仮想キーコード クロージャ)
 のように使います.メタキーや仮想キーコードは,windef.scmを参考にしてください.~
 また,アルファベットや数字キーを使う場合は,キャラクタを使ってください.(#\a)等~
 
 たとえば,Alt+Enterに前面のウィンドウを最小化する機能を割り当てるには
 #plain(){{
 (set-key mod-alt vk-return
 	 (lambda ()
 	   (show-window (get-foreground-window) sw-minimize)))
 }}
 のようにuser.scmに書いてください.~
 複数のメタキーを使いたい場合は
  (set-key (+ mod-alt mod-control) vk-space ...)
 のように,+で足してください.~
 
 ちなみに,多くのキーは奪う事ができるので
  (set-key 0 #\a (lambda () (display "type a\n")))
 などとすれば,メモ帳などで,'a'を入力する事ができなくなったり
  (set-key mod-control #\c (lambda () (display "copy?\n")))
 とすれば,コピーを無効にしたりできますが,一部のショートカットは上書きできないようです.~
 有名所では,Ctrl+Alt+Deleteは上書きできませんが,他の多くのWin+?のキーも上書きできないようです.(Win+L のウィンドウズのロックなど)~
 これを何とかする方法((Ctrl+Alt+Delは無理な気がしますが))をご存知の方がいらっしゃいましたら,ぜひ教えてください.
 
 *使える関数 [#e34d9bba]
 基本的な算術関数等が使えます.また,init.scmやmisc.scmで多くの基本的な関数が定義されています.~
 winmove.scmはウィンドウを動かしたり,選択を切り替えたりに使える関数が定義されていますが~
 バージョンアップなどで,好き勝手に私がいじる可能性があります^^;~
 
 細かい便利な関数が沢山あるのですが,少しずつ説明を書きます・・・~
 init.scm, misc.scm, winmove.scm辺りを読んでみてください.
 
 また,Windowsの機能を呼び出すための関数が,組み込み関数として定義されています.~
 多くの関数は,WindowsAPIと同じように使えます.~
 (私が)よく使うもの以外の説明は,後日・・・.WindowsAPIと同じように使える物がほとんどです.
 -set-window-pos~
 -set-window-rect~
 -get-window-rect~
 -get-workarea~
 -show-window~
 ウィンドウの表示の状態を変えます.
  (show-window ウィンドウハンドル 状態)
 --最前面のウインドウを最大化する~
  (show-window (get-foreground-window) sw-maximize)
 状態には以下の値が取れます(他にもありますが・・・)~
 --sw-hide~
 非表示にする.(最小化ではなく,本当に見えなくなる)
 --sw-show~
 sw-hideされたものを表示する.
 --sw-normal~
 普通の状態に戻す.最小化,最大化された状態も元に戻る
 --sw-restore~
 sw-normalと同じ?
 --sw-maximize~
 最大化する
 --sw-minimize~
 最小化する~
 -set-active-window~
 -set-foreground-window~
  (set-foreground-window ウィンドウハンドル)
 ウィンドウを最前面に表示します
 -get-foreground-window~
  (get-foreground-window)
 最前面のウィンドウのウインドウハンドルを取得します
 -find-window~
  (find-window ウィンドウクラス名 ウィンドウのタイトル)
 ウインドウクラス名,ウィンドウのタイトルからウィンドウハンドルを取得します.~
 ウィンドウクラス名や,ウィンドウのタイトルに0や()をしていすると,その項目は無視します.~
 --電卓のウィンドウハンドルを得る~
  (find-window () "電卓")
 -get-window
 -get-window-style
 -get-next-window
 -enum-windows~
 ウィンドウハンドルの一覧を取得します.
 -enum-visible-windows~
 可視状態のウィンドウハンドルの一覧を取得します.最小化されているウィンドウも含みます.
 -is-window
 -is-window-visible
 -is-iconic
 -is-zoomed
 -get-window-text~
  (get-window-text ウィンドウハンドル)
 ウィンドウのタイトルを取得します.
 -get-tick-count~
 システムが起動してからの時間を,ミリ秒で返します.
 -time-get-time~
 マルチメディアタイマ版.精度が高いです.
 -time-begin-period
 -time-end-period
 -send-message", scmSendMessage);
 -sleep~
 スリープ
  (sleep ?ms)
 -launch~
 アプリケーションの起動
  (launch コマンド カレントディレクトリ)
 カレントディレクトリは省略できます
 -create-window-ex~
  (create-window-ex winproc exstyle class-name name style x y w h)
 -create-window~
  (create-window winproc class-name name style x y w h)
 -destroy-window~
  (destroy-window hwnd)
 -get-system-metrics~
 -post-quit-message~
  (post-quit-message 終了コード)
 
 **要望希望 [#j055e67c]
 使えるWindowsAPIが非常に少ないので,要望があれば教えてください.~
 具体的なAPI名でもOKですし,やりたい事を書いていただいてもOKです.実装する保障はありませんが・・・
 
 あと,GetProcAddressを使ってほげほげも考えてはいるのですが・・・ぅーん
 -mayu(窓使いの憂鬱)のように単にキーを入れ替えるということはできますか?「キーを押下」みたいな関数があればいいように思いますが。VirtualDemensionとmayuがひとつで置き換えられそうで大変期待しています。 -- [[質問]] &new{2007-10-28 09:23:58 (日)};
 
 #comment
 
 *サンプルコード [#e538860e]
 -ウィンドウを必ず前面に表示~
 #plain(){{
 ;; アイコン状態のウィンドウを前面に表示する
 (define (restore-window hwnd)
   (if (is-iconic hwnd)
       (show-window hwnd sw-restore))
   (set-foreground-window hwnd))
 }}
 -Alt+Tab的なもの~
 restore-windowが必要です
 #plain(){{
 ;; (next=#t => alt-tab) (next=#f => alt-shift-tab) 的な動き
 (define (switch-window next)
   (if next
       (begin (set-window-pos (get-foreground-window) hwnd-bottom 0 0 0 0 (+ swp-nosize swp-nomove))
 	     (restore-window (get-visible-first-window))) ; z-orderを手前にしただけじゃ,選択されない
       (restore-window (get-visible-last-window))))
 }}
 -アクティブなウインドウの 元に戻す<->最大化~
 #plain(){{
 (define (toggle-window-state hwnd)
   (show-window hwnd
 	       (cond ((is-zoomed hwnd) sw-normal)
 		     (else             sw-maximize))))
 }}
 -Alt+M で WindowsMediaPlayerの 元に戻す<->最小化~
 #plain(){{
 (define (toggle-window-icon-state hwnd)
   (cond ((is-iconic hwnd) (restore-window hwnd))
 	(else             (show-window hwnd sw-minimize))))
 
 (set-key mod-alt #\m
 	 (lambda ()
 	   (toggle-window-icon-state (find-window () "Windows Media Player"))))
 }}
 
 *バグなどの連絡 [#q9835288]
 #comment