WindowsManagerの使い方

インタプリタ

WindowsManagerを起動した状態で,Ctrl+Alt+Dを押すと,以下のような画面が出るはずです.

wmscm.PNG

この画面上では,Schemeというプログラミング言語の命令を評価(実行)する事ができます.
1+2や,変数の定義などもできます.

wmscm_eval.PNG

このように,WindowsManagerでは,評価の結果が画面に表示されます.
また,Schemeは多くの有名な大学のプログラミング入門等にも使われている言語です.
プログラミングを知らない方や,Schemeを知らない方でも,簡単に覚えれます.
もうひとつのScheme入門が入門に向いていると思います.

適当に,加減乗除でもしてみてください.ちょっと高機能な電卓としても使えますね.

設定

system.scmが起動時に読み込まれます.設定を変更する際は,system.scmからloadされる,user.scmを編集すると良いです.
WindowsManager起動中にuser.scmを更新した場合は,インタプリタ上で

(load "user.scm")

とすれば,設定が更新されます.

キーバインドの設定

よく使う機能はインタプリタ上で入力することなく,ショートカットキーで呼び出せるようにすると便利です.
set-key関数を使うことで,ショートカットキーを割り当てる事ができます.
set-key関数は

(set-key メタキー 仮想キーコード クロージャ)

のように使います.メタキーや仮想キーコードは,windef.scmを参考にしてください.
また,アルファベットや数字キーを使う場合は,キャラクタを使ってください.(#\a)等

たとえば,Alt+Enterに前面のウィンドウを最小化する機能を割り当てるには

(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 のウィンドウズのロックなど)
これを何とかする方法*1をご存知の方がいらっしゃいましたら,ぜひ教えてください.

使える関数

基本的な算術関数等が使えます.また,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 終了コード)

要望希望

使えるWindowsAPIが非常に少ないので,要望があれば教えてください.
具体的なAPI名でもOKですし,やりたい事を書いていただいてもOKです.実装する保障はありませんが・・・

あと,GetProcAddressを使ってほげほげも考えてはいるのですが・・・ぅーん


お名前:

サンプルコード

  • ウィンドウを必ず前面に表示
    ;; アイコン状態のウィンドウを前面に表示する
    (define (restore-window hwnd)
      (if (is-iconic hwnd)
          (show-window hwnd sw-restore))
      (set-foreground-window hwnd))
    
  • Alt+Tab的なもの
    restore-windowが必要です
    ;; (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))))
    
  • アクティブなウインドウの 元に戻す<->最大化
    (define (toggle-window-state hwnd)
      (show-window hwnd
               (cond ((is-zoomed hwnd) sw-normal)
                 (else             sw-maximize))))
    
  • Alt+M で WindowsMediaPlayerの 元に戻す<->最小化
    (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"))))
    

バグなどの連絡


お名前:

*1 Ctrl+Alt+Delは無理な気がしますが
添付ファイル: filewmscm_eval.PNG 1605件 [詳細] filewmscm.PNG 1509件 [詳細]