F#で閉じられないウインドウを作る(見た目もちょっとは考える)

何をした

C#×WPFだとそれなりに資料が見つかるAlt+F4などでのウインドウクローズを抑止する方法ですが、F#×WPFだと方法が見つけられなかったので。(多分探し方が悪い)
サブウインドウなどで使います。

やり方

コード抜粋。コーディング規約とか無茶苦茶かも……

(* 定数宣言 *)
let GWL_STYLE = -16
let WS_SYSMENU = 0x80000

(* Win32API関数読み込み *)
[<DllImport("user32.dll")>]
static extern int GetWindowLong(IntPtr hWnd, int nIndex)

[<DllImport("user32.dll")>]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong)

(* XAML読み込み *)
let window = Application.LoadComponent (Uri("/xaml/HogeWindow.xaml", UriKind.Relative)) :?> Window

(* まずはウインドウを表示 *)
let _ = window.Show ()

(* ウインドウハンドルを取得してもろもろの操作 *)
let hWnd = (new WindowInteropHelper (window)).Handle
let _ = SetWindowLong (hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) &&& ~~~WS_SYSMENU)
let _ = window.Closing |> Event.add (fun e -> e.Cancel <- true)

やってることはWin32APIを手続き的に叩いているだけですね……
タイトルバーのもろもろをWS_SYSMENUのビットOFFにして非表示化して、そのあとClosingのイベントをハンドリングして閉じないようにさせているだけです。

let _ = window.Closing |> Event.add (fun e -> e.Cancel <- true)

ここを書ければ勝利な気がします。

タスクバーの方にウインドウ情報を非表示にするには、XAML側でWindowタグの属性に

ShowInTaskbar="False"

を付ければいけます。

おわり

F#でWPF触った事例とかもっと見つかってほしい。

最近表立って何もできていませんが、ひっそりとWPFとF#で何か作ることを思い立ってこんなことやってます。

検索用:fsharp(これがないと引っかからないかも)