« 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.19

Inno Script Studioを使用してセットアップファイルを作成する

Inno Setupを使用したセットアップファイルの作成方法についてはWeb上に色々と情報が公開されていますが、Setup Scriptを簡単に作成できるInno Script Studioに関する情報が少ないようなので、自分自身の覚書としてまとめます。Inno Script StudioではWizard形式でプロジェクトの雛形を作成出来るようですが、よくわからないので今回はTouchを例にして空のプロジェクトから作成してみます。

Inno Script Studioを起動すると以下のダイアログが表示されますので、Blank Scriptを選択してOKボタンを押します。
00
0

まずは、左上のオプションボタンを押してプロジェクト全体のオプションを設定していきます。
1
アプリケーションのフォルダ名を設定します。デフォのフォルダ名に、{pf}\アプリケーションをインストールするフォルダ名を入れます{pf}はProgram Filesフォルダ(もしくはProgram Files(86)フォルダ)のことです。この例では\Program Files\Touchフォルダにインストールされます。

2
続いてプログラムグループを設定します。デフォのグループ名にグループ名を入れます。ここで設定したグループ名はプログラムメニューのフォルダ名になります。

3
再起動マネージャを設定します。デフォルトでは、アプリを再起動するにもチェックが入っていますので、インストール後にWindowsを再起動する必要が無い場合はこのチェックを外します。

4
動作環境を設定します。ここは設定しなくても構いませんが、Windows95/98にインストールされると問題が出るかもしれないので、一応Windows7(ウィンドウズNT欄の右側の参照ボタンを押して表示されるダイアログボックスでWindows7を選択する)以上に設定します。
他にも設定項目が色々とありますが、全てを設定する必要はないものの、発行者情報やユーザ情報、バージョン情報などは設定しておいたほうが良いでしょう。

プロジェクト全体の設定が終わったら、セットアップファイルを作成するための実際の作業に入ります。
5
まずは、インストールするアプリケーションの実行ファイルやヘルプファイルなど付属させるファイルを登録していきます。
アイテム追加ボタンを押すと以下のダイアログボックスが表示されます。
6
まず、ソースファイル名にインストールするファイルを指定します。次に宛先フォルダのドロップダウンリストからファイルをインストールするフォルダを指定します。最初に行ったプロジェクトオプション設定がきちんと行われていれば、ドロップダウンリストの一覧に{pf}\インストールフォルダ(この場合は{pf}\Touch)があるはずです。その他の項目は設定不要です。

皆さんはセットアップ実行中に「デスクトップにシィートカットを作成する」等の追加のオプション選択を見たことがあるでしょうか。ここではセットアップに「デスクトップにシィートカットを作成する」を追加してみたいと思います。
16
左側の選択メニューでタスクを選び(左側メニューの上から順番に設定していきたいところですが、ここは先に設定しておく必要があります)、アイテム追加ボタンを押します。

17
名前に適当な名前(日本語は設定できません)を付けて、セットアップ実行時に表示する文字列を説明欄に入力してOKボタンを押します。タスクで設定した項目はセットアップ実行時のオプション項目としてON/OFFを選択できるようになります。


タスクを追加したら、通常の作業に戻ります。次はプログラムメニュー等に登録するショートカットアイコンの設定です。
7_2

アイテム追加ボタンを押してアイテムを追加していきます。
8_3
ショートカットアイコンの名前を設定し、ファイル名はファイルで設定したアイテムがドロップダウンリストに表示されますので、ここから選択します。プログラムグループにアイコンを作成する場合の宛先は{group}です。この{group}はプロジェクトオプションで接待したプロジェクトグループフォルダのことです。この例ではアイコンファイル名も指定していますが省略しても構いません。省略した場合はデフォルトのアイコン(アプリケーションであれば、そのアプリケーションのデフォルトアイコン、その他のファイルであれば関連付けられたアイコン)を使用します。

9_2
また、プログラムグループにアンインストールメニューを追加したい場合は、適当な名前をつけて、ファイル名の一覧から{uninstallexe}を選択します。

10
次にいよいよデスクトップへのショートカットアイコン登録設定です。
名前とファイル名を設定したら、宛先ディレクトリの一覧から[commondesktop]を選択します。次にセットアップオプションでデスクトップショートカットを作成するかどうか切り替えられるように、ダイアログボックスのタブTasksを設定します。
11
先程タスクに追加したアイテムがリストに表示されていますので、このチェックをONにします。これで、このアイテムはセットアップ時に「デスクトップにショートカットを作成する」を選択した場合にだけ実行されるようになります。

続いて言語を設定します。言語を設定しないとセットアップが英語表示となります。
12
アイテム追加ボタンを押して言語アイテムを追加します。
13
名前にJapaneseを設定し、メッセージファイルの参照ボタンを押してJapanese.islを選択します。OKボタンを押せば登録は終わりです。

また、セットアップの最後に「Readme.txtを表示する」等の選択表示がある場合がありますが、これも設定してみます。
14
インスト時に実行でアイテム追加ボタンを押します。
15
ファイル名の一覧から実行したいファイルを選択して(この場合は「はじめに読んで下さい.txt」)、FlagsのGeneralでpostinstallとshellexec(この場合実行するのはテキストファイルなので、関連付けられたアプリケーションを起動する必要があるため)をチェックします。

これで一通り完了です。完成したInno Setup用のスクリプトファイルは「スクリプト」を選択することで確認できます。あとはプロジェクトメニューのコンパイルかスピードボタンでコンパイルすればセットアップファイルが作成されます。
18

上記の手順で作成したセットアップファイルの実行例

Setup1
{pf}Touchの通りになっています。

Setup2
プログラムグループも設定通りです。

Setup3
追加のオプションが表示されています。

Setup4

Setup5
セットアップの最後に「初めに読んで下さい.txtの表示」選択が表示されました。

Inno Setupの使い方は色々と情報がありますが、スクリプトをごりごりと直接記述する方法が殆どで初心者には敷居が高い感じがします。一方、Inno Script Studioを使用すれば上記のように、わかりやすいユーザインタフェースである程度のセットアップファイルを作成出来ますので便利ではないでしょうか。
尚、Inno Script Studioとその日本語化については以下情報があります。
Inno Script Studio https://www.kymoto.org/products/inno-script-studio
日本語化 https://www42.atwiki.jp/jfactory/pages/75.html


| | コメント (0) | トラックバック (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月 »