« 2017年6月 | トップページ | 2017年8月 »

2017.07.28

Windowsでウィンドウの影表示をON/OFFする

MiCapLiteで特定のウィンドウをキャプチャする際に、WIndows7では四隅の丸く面取りされている部分にウィンドウの影とデスクトップの背景が写り込んでしまします。
で、一時的にウィンドウの影を非表示にして、そのウィンドウの裏側に無地のフォームを表示させることで、角の丸い部分の裏側もきれいにキャプチャ出来るのではと思った次第です。
ところが、Web上を検索してもプログラム上からAPI等を使ってウィンドウの影表示をON/OFFする方法が中々見つからなかったのですが、MSDNの英語版ページでやっと見つけました。
ちなみに、レジストリ「HKEY_CURRENT_USER\Control Panel\Desktop」のキー「UserPreferencesMask」の値を書き換える方法も試したのですが、該当のデータを書き換えてもその結果はWindowsにログオンし直さないと反映されないため使えませんでした。

見つけたAPIはSystemParametersInfoで、このAPIを用いるとデスクトップの影表示のON/OFFを即座に切り替えることが出来ます。MiCapLiteでは、特定のウィンドウをキャプチャする際にウィンドウの影が有効になっているかどうかを確認し、有効だった場合には一旦影を無効にしてウィンドウの裏側に背景色を表示させてキャプチャし、その後影の表示を元に戻すといった処理にしました。

普通にキャプチャ・・・四隅に影と背景が残っている
Captnormal

ウィンドウの影をOFFにして裏側を白色でカバーした場合
Captwoshadow

ウィンドウの影部分までを裏側白色でカバーしてキャプチャした場合
Captwshadow

このAPIデスクトップ環境の変更だけではなく様々な環境の設定状況の取得と変更が出来るようです。尚、日本語版のMSDNにもSystemParametersInfoの説明はありますが、uiActionに指定する機能定数が一部しか掲載されておらず、今回用いたウィンドウの影表示に関するSPI_GETDROPSHADOWとSPI_SETDROPSHADOWの情報もありませんでしたので、詳しく知りたい方は英語版のページを参照することをおすすめします。

英語ページ:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724947(v=vs.85).aspx
日本語ページ:https://msdn.microsoft.com/ja-jp/library/cc429946.aspx

尚、uiActionに指定する定数はDelphi10.1では既に定義されているようですが、もし定義されていない開発環境の場合は、英語版MSDNのページを参照して絶対値で指定しても良いかと思います。

BOOL WINAPI SystemParametersInfo(
_In_    UINT  uiAction,
In_    UINT  uiParam,
_Inout_ PVOID pvParam,
_In_    UINT  fWinIni
);
// SystemParametersInfoで取得・設定できる項目
// Accessibility parameters
// Desktop parameters
// Icon parameters
// Input parameters
// Menu parameters
// Power parameters
// Screen saver parameters
// Time-out parameters
// UI effect parameters
// Window parameters
 
// ウィンドウの影表示をON/OFFする
// Flag:  影の表示モード
//        True: 表示する, False:表示しない
procedure SetWindowShadow(Flag: Boolean);
begin
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(Flag), 0);
end;
 
// ウィンドウの影表示の状態を取得する
// Result:  影の表示モード
//        True: 表示する, False:表示しない
function GetWindowShadow: Boolean;
var
  pvParam: Boolean;
begin
  SystemParametersInfo(SPI_GETDROPSHADOW, 0, Pointer(pvParam), 0);
  Result := pvParam;
end;

| | コメント (0) | トラックバック (0)

2017.07.23

MiGrep Ver1.2正式版を公開しました

私のホームページからダウンロードが可能です。
尚、Vectorさんからも1週間以内にダウンロード可能になると思います。

また合わせて、NightlyBuildで公開していた、MiCapLite, Touch, SendFileToも更新版をホームページで公開しています。

| | コメント (2) | トラックバック (0)

2017.07.09

MiGrep2がVectorの6月度ランキングに入りました

MiGrep2がVectorの6月度よく読まれた記事TOP10に入りました。

#Ver1.2正式版を早く公開できるようにしないと・・・

| | コメント (0) | トラックバック (0)

2017.07.04

送るメニューにフォルダへのコピーを追加する

プログラムを開発している中で本格的に動作を確認したいときに、そのプログラムをインストールしてあるフォルダにコピーしているのですが、作成した実行ファイルを開発用のフォルダでコピーしてインストールフォルダに貼り付ける操作が面倒なため、エクスプローラの「送る」メニューに追加する「フォルダにコピー」プログラムを作成して使用しています。取るに足らないものですが、一度コピーしたフォルダを履歴として記録して選択できるため一部の方には便利かも知れませんので、先出のMiCapture Liteに引き続いて公開します。

プログラムの内容は非常にシンプルなものですが、プログラムをインストールするProgram FilesもしくはProgram Files(x86)フォルダにファイルをコピーするためには、通常は管理者権限への昇格が必要だと思います。そのため、コピーするファイルもしくはフォルダをコピーして失敗した場合は、コピー用のサブ実行ファイル(ファイルサイズを小さくしたいためコンソールアプリケーションにしましたが、それでも962kb・・・)を監視者昇格モードで起動してコピーするようにしています。

送るメニュー
Filessenndto

ファイルをコピーを起動
Filessendto



// 管理者権限で外部アプリを呼ぶ
// 参照元:KINOさんのflow of water http://fow.minim.ne.jp/blog/?p=88
function RunAsAdmin(hParent: HWND; const ExeFileName, Param: string): Boolean;
var
sei: TShellExecuteInfoW;
begin
FillChar(sei, SizeOf(sei), 0);
sei.cbSize := SizeOf(sei);
sei.Wnd := hParent;
sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
sei.lpVerb := 'runas';
sei.lpFile := PChar(ExeFileName);
sei.nShow := SW_SHOWNORMAL;
sei.lpParameters := PChar(Param);
Result := ShellExecuteEx(@sei);
end;

procedure TForm1.CopyFiles(DstFolder: string);
var
srcfile, dstfile, fname, folder: string;
i: integer;
begin
folder := DstFolder;
for i := 1 to ParamCount do
begin
srcfile := ParamStr(i);
if TDirectory.Exists(srcfile, False) then
begin
fname := srcfile + '.$$$';
fname := ExtractFileName(fname);
fname := ChangeFileExt(fname, '');
dstfile := folder + '\' + fname;
try
TDirectory.Copy(srcfile, dstfile);
// Copyに失敗したら相手先フォルダ書き込みにAdmin権限が必要と判断して
// RunAsAdminでコピー用のコンソールアプリAdminCopy.exeを呼ぶ
except
RunAsAdmin(Handle, '.\AdminCopy.exe', '/D "' + srcfile + '" "' + dstfile + '"');
end;
end else begin
fname := ExtractFIleName(srcfile);
dstfile := folder + '\' + fname;
try
TFile.Copy(srcfile, dstfile, True);
// Copyに失敗したら相手先フォルダ書き込みにAdmin権限が必要と判断して
// RunAsAdminでコピー用のコンソールアプリAdminCopy.exeを呼ぶ
except
RunAsAdmin(Handle, '.\AdminCopy.exe', '/F "' + srcfile + '" "' + dstfile + '"');
end;
end;
end;
if IsShowResult.Checked then
MessageDlg(DstFolder +'に'+#13#10 + IntToStr(ParamCount)
+ ' 個のファイルまたたフォルダをコピーしました.',
mtInformation, [mbOK], 0);
Close;
end;


AdminCopy.exeのプロジェクト

program AdminCopy;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
System.IOUtils;

var
Mode, Src, Dst: string;

begin
try
if ParamCount < 3 then
Exit
else begin
Mode := ParamStr(1);
Src := ParamStr(2);
Dst := ParamStr(3);
if Mode = '/D' then
TDirectory.Copy(Src, Dst)
else
TFile.Copy(Src, Dst, True);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

また、セットアッププログラムの作成にはInno Setup + Setup Scriptを使用しています。実行ファイル本体はインストールフォルダにコピーして、「送る」フォルダにショートカットを作成することが出来ますのでとても便利です。
公開ファイルにはセットアップファイルと、Inno setup scriptプロジェクトファイルを含むソースファイルを同梱しました。

「fssetup.zip」をダウンロード

| | コメント (0) | トラックバック (0)

2017.07.02

MiCapture Lite ver1.0

昔公開していた画面キャプチャソフトMiCaptureを、MiGrep2やMiBarcode用のヘルプファイル作成用画像編集のために、一から作り直しました。
Liteとつけたのは、旧版にあった簡易図形描画機能を省いたからです。逆に範囲を指定しての画像のぼかし機能を追加しています。

Micaplite

試作版なので実行ファイル本体のみです。

「MiCapLite.zip」をダウンロード

| | コメント (0) | トラックバック (0)

MiGrep2 ver1.2先行版の公開

MiGrep2 ver1.0ですが、色々と不具合が見つかってきたため修正中です。
取り敢えず更新版候補が出来ましたのでMiGrep2本体のみを公開します。ダウンロードしたZIP書庫を解凍して、MiGrep2.exeをMiGrep2をインストールしたフォルダに上書きコピーして下さい(コピーには管理者権限が必要な場合があります)。
尚、本バージョンでオプションメニューと設定パネルの仕様を変更しましたのでご注意下さい。

Ver1.2での変更点

不具合修正
・ファイル名を相対パスで表示する際に、書庫ファイル内のファイルの表示がおかしかった不具合を修正
・エクスプローラのコンテキストメニューからMiGrep2を実行する際に、選択したフォルダもしくはファイルが一つしかない場合にうまく検索できない場合があった不具合を修正
・文字コードの自動判定で、UTF-8Nを正常に判定出来ない場合があった不具合を修正(おそらく旧版MiGrepも同じ不具合があったはず)
・文字コードの自動判定でUnicode Big-Endianを正常に判定出来ない場合があった不具合を修正(Delphiの内部・文字コードがUnicodeになったための不具合)
機能の修正・追加
・ファイル読み込み時の文字コード変換を自前処理からDelphi標準のTEncodingを使用した処理に変更
・一覧のカラムをクリックするとリストをソートする機能を追加
・文字コード自動判定時に選択したファイルの文字コードをステータスバーに表示する機能を追加(文字コード自動変換時のみ)
・一括置換のメニューとスピードボタンを追加。機能自体は未実装
・オプションメニューの項目と設定パネルの項目を整理(設定切替をメニューに移動)

Ver1.1での変更点(非公開)
・ポップアップにファイルのフルパス名を表示する機能を追加
・その他細かな修正

「MiGrep2v1.2.zip」をダウンロード


| | コメント (0) | トラックバック (0)

« 2017年6月 | トップページ | 2017年8月 »