Windowsにおいて、ウインドウの位置を保存しておいて次回起動時に復元するといった事は普通の設計です。
しかしながら、保存した時とデスクトップのサイズが変わっていたりしてウインドウが画面外に行ってしまうという心配がちょっとあります。
特にウインドウがマウスで触れないと移動も出来ないような設計だと困ってしまいます。
なので、最初にウインドウがモニタの表示領域に入っているのかをチェックする必要があります。
で、やりがちなミスが以下のパターン。
//間違ったやりかた、デスクトップの領域を取得
rt.left = 0;
rt.top = 0;
rt.right = GetSystemMetrics( SM_CXSCREEN );
rt.bottom = GetSystemMetrics( SM_CYSCREEN );
上記では確かにデスクトップのサイズが取得出来るのですが、実はプライマリモニタだけの領域です。
マルチモニタ環境においては一番左上の座業は0ではなく負の値である事もあります。
上をちょっと改良してSM_CXSCREEN,SM_CYSCREENの代わりにSM_CXVIRTUALSCREEN,SM_CYVIRTUALSCREENを使うと仮想デスクトップ領域が得られます。
つまり全てのモニタを囲む大きな矩形領域です。
更にSM_XVIRTUALSCREEN,SM_YVIRTUALSCREEN でデスクトップの左上の座標が得られます。
しかしながらこれでも不安が残ります。
各モニタのサイズが違ったら仮想デスクトップの中に無効な領域が存在することになるからです。
じゃどうすれば良いのかって事ですがMonitorFromWindow()を使えば一発解決です。
このAPIはウインドウを指定して、そのウインドウが複数あるモニタの表示領域と一番多く重なるモニタのハンドルを返してくれます。
そしてMONITOR_DEFAULTTONULLを指定すると全く重なる領域がない場合にはNULLが返ります。
こんな感じで。
if(!MonitorFromWindow(hWnd,MONITOR_DEFAULTTONULL)){
//有効なモニタの中に入ってない
}
まぁ、これだと1ピクセルでも重なっていればOKって事になってしまって、そんなのユーザーが見つけられねぇよって事になりそうではあります。
その場合は姉妹品(?)のMonitorFromPoint()を使って自分で座標の重なり具合をチェックすればOKです。
タイトルにした「デスクトップの領域を得る方法」が書いてないですね。
領域自体を数値として取得したいならば、途中に書いた方法で仮想デスクトップ領域を得て満足するか、もっと完全な領域を取得したかったらGetMonitorInfo()を使えばいいかと思います。
(.VMGファイルからの画像抽出)
N905iμを使ってます。
最近microSDスロットの調子が悪く、いつのまにかカードを認識していなかったりします。
修理に出す前にデータのバックアップを考えてみました。
ドコモの端末で面倒なのが受信メールに添付された画像などです。
自動的にデータとして保存してくれないのでmicroSDに書き出すには1件づつメールを開いて「データを保存」を選択しないといけません。
(他のキャリア・端末は知りませんが、前使っていたauのtalbyは自動的に保存されました)
そんなことやってられんなぁ、、と思っていたのですが、メールBOXのところで"microSDに全件コピー"という項目があるのを発見しました。
実際やってみると添付ファイルがbase64でエンコードされたままの状態で(つまりはメールヘッダ含めて全部)を保存してくれるみたいでした。
もしかしたらドコモのサイトにあるツールで変換できるのかもしれませんが面倒なので添付ファイルだけを一括抽出するスクリプトを書いてみました。
(実際メールで添付ファイルとして受信したファイルを見てみるとほとんどのファイル名が"image.jpg"になってます。
これでは訳がわからなくなるのでメールの受信日+拡張子でファイルを生成するようにしました。)
結果、全受信ファイルの添付ファイルがPCで閲覧できるようになりました。
もっと早くやればよかったです。
あんまりにも古いのは既に消えてしまっていたし・・・。
端末の操作で書き出されるファイルは"SD_PIM"の下に出来ます。
PIMxxxxx.VMGといった名前になるようです。
試してませんが他のキャリアでも同じだと思います。
メールはmultipartになっていて添付ファイルも普通にbase64でエンコードされています。
とりあえず発見したbase64の部分を全てファイルに変換するようにしました。
(フォーマットは厳密に解釈していないので変わったデータだとおかしくなるかも・・・)
動画やデコメの部品なんかも変換されますがデコメ文字は開けませんね。
もしかしたらプリインストールの著作権保護がかかっている画像なのかもしれません。
コピー許可があるものならOKかどうかは未確認です。
デファクトスタンダードとはいえ、携帯電話の扱うデータもだいぶ標準化されてきましたね。
後はi-mode FeliCa関連(おサイフケータイ関連)をどうやって保護したらいいのかが心配なところです。
ドコモショップで聞くかなぁ・・・。
だいたいの場合相手が知識不足すぎて時間の無駄になるんですが・・・。
作ったスクリプトを置いておきます。
Perlです。