.NET

ShellExecuteEx

ShellExecuteExはSTA内で呼び出さなくてはならないらしい。 「コントロールパネル\管理ツール\サービス」等が何故かShellExecuteExで実行できないな〜、と思ったら、STAでないスレッドプールのスレッドからShellExecuteExを呼び出していたのが原因だった。

Tips

マネージド環境から作成されたSTA COMオブジェクトのメソッドは、自動的にオブジェクトが作成されたスレッドで実行される。(カレントスレッドIDを返すCOMオブジェクトを作成して確認済み)

デリゲート呼び出し中に

そのデリゲートに変更を加えても、その変更はデリゲートの呼び出しが全て完了するまで反映されない。 delegate void NonParamMethod(); static NonParamMethod TheEvent; void Main(string[] args) { TheEvent += Func1; TheEvent += Func2; TheEvent(); } v…

RichTextBoxで漢字変換中に

LinesプロパティをTextプロパティの値を取得すると、漢字変換が強制的に確定されてしまう。SelectionCharOffsetの取得やGetLineFromCharIndex()の呼び出しは大丈夫っぽい。

GUIスレッドが複数存在する場合、

Application.Exit();を呼び出すと、全てのスレッドのウィンドウが一つのスレッドから破棄されるためか、異常が起こる。Application.ExitThread();を使用し、適切に終了処理を行うと異常は起こらなくなった。

Alt+Tabで表示されない、枠無しのウィンドウを作成するには

タイトルが空のツールウィンドウを作成すればよい

トップレベルウィンドウが表示されなくなる

タスクバーを自動的に隠す設定にしてある場合で、マウスポインタをタスクバー付近に移動させてもタスクバーが表示されないような状態になると、この現象が起こる。 Windowsキーを押して、タスクバーが正常に動作するようになると治る。

DDEもどき

アプリケーションの二重起動を防止し、既存のプロセスにコマンドを渡す。これだけの事なんだけど、Rekisaにはこの機能が無かった。「.NETではDDE使えないなー」とか思ってたから。けれど、起動の遅さが気になりだしたので、この機能を作る事にした。二重起動…

Stream.Seekの戻り値は

origin引数に指定した値に関わらず、先頭からのオフセットである。

Stringクラスで

a!=b かつ a.CompareTo(b)==0 である場合が存在する。

ListBoxの文字列を編集

ListBox.Itemsの項目を再設定すれば良い。 例: listBox.Items[listBox.SelectedIndex]="新規テキスト"; ただし、項目削除中のSelectedIndexChangedの実行中にこれを行うと内部状態がおかしくなり、あとで例外が発生する事になる。

IDataObject.GetData でデータを取得する為には

使用するデータがバイナリシリアライズ可能である必要がある。

ListView.Item.Addで例外

Columnが一つもない状態でListView.Item.Addを呼び出した場合、成功はするが、内部で例外が発生しキャッチされている為、動作が遅くなる。

例外

ListView.SelectedIndexChangedイベント内で ListView.Items.Add を呼び出すと何故か例外が発生する。しかもcatchできない。「何が問題なのか?」と考えてみたら、何も問題ではなかった。ただ単にデバッガが例外を捉えるように設定していたことが原因だった。…