/
Program.cs
284 lines (261 loc) · 11.5 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace ClickCapture {
/// <summary>
/// メインクラス
/// </summary>
public static class Program {
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
public static void Main() {
// ミューテックスを使用して多重起動を抑制する
var eMutex = new System.Threading.Mutex(false, "MYSOFTWARE_001");
// ミューテックスの所有権を要求
if (!eMutex.WaitOne(0, false)) {
return;
}
// アプリケーション準備
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 画面キャプチャクラス生成
var eClickCapture = new ClickCapture();
// アイコン設定処理
eClickCapture.SetComponents();
// アプリケーション実行
Application.Run();
}
}
/// <summary>
/// 画面キャプチャクラス
/// </summary>
public class ClickCapture : Form {
/// <summary>
/// モード用メニュー項目リスト
/// </summary>
private List<ToolStripMenuItem> MenuGroupItems { set; get; } = new List<ToolStripMenuItem>();
/// <summary>
/// タスクトレイアイコン
/// </summary>
private NotifyIcon AppIcon { set; get; } = new NotifyIcon();
/// <summary>
/// コンストラクタ
/// </summary>
public ClickCapture() {
// タスクバーに表示しない
ShowInTaskbar = false;
// タイマー監視設定
var eTimer = new Timer();
// 50ミリ秒毎にチェック
eTimer.Interval = 50;
// イベントハンドラ設定
eTimer.Tick += new EventHandler(OnMouseOperation);
// タイマー実行
eTimer.Start();
}
/// <summary>
/// アイコン設定処理
/// </summary>
public void SetComponents() {
// 自分自身のプロジェクトパス
var eThisDir = Path.GetDirectoryName(Directory.GetCurrentDirectory());
// アイコンパス
var eIcoPath = Path.Combine(eThisDir, "ClickCapture", "ICO", "Copy.ico");
// アイコン設定
AppIcon.Icon = new Icon(eIcoPath);
// タスクバーの通知領域に表示
AppIcon.Visible = true;
// アプリケーションの説明
AppIcon.Text = "左クリックを押しながら右クリックでスクリーンショット";
// アイコンに追加
AppIcon.ContextMenuStrip = CreateMenu();
}
/// <summary>
/// アクティブウインドウのスクリーンキャプチャを保存またはクリップボードにコピーする
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnMouseOperation(object sender, EventArgs e) {
try {
// 左クリックと右クリックが押し続けられている場合
if (IsKeyPress(Keys.LButton) && IsKeyPress(Keys.RButton)) {
// WindowsAPI情報
var eWindowsAPI = new WindowsAPI();
// アクティブウインドウのサイズと位置を取得する
var eRect = eWindowsAPI.GetWindowRectangle();
// 幅
var eWidth = eRect.Right - eRect.Left;
// 高さ
var eHeight = eRect.Bottom - eRect.Top;
// 新規RECT作成
var eRectangle = new Rectangle(eRect.Left, eRect.Top, eWidth, eHeight);
// ビットマップに変換
var eBitmap = new Bitmap(eRectangle.Width, eRectangle.Height, PixelFormat.Format32bppArgb);
// スクリーンショット
using (var eFromImage = Graphics.FromImage(eBitmap)) {
eFromImage.CopyFromScreen(eRectangle.X, eRectangle.Y, 0, 0, eRectangle.Size, CopyPixelOperation.SourceCopy);
}
// チェックされたメニュー項目を取得
var eCheckedItem = MenuGroupItems
.Where(x => x.CheckState == CheckState.Checked)
.FirstOrDefault();
// クリップボードにコピーする場合
if (eCheckedItem.Name == "ClipBoard") {
Clipboard.SetImage(eBitmap);
}
// 画像を保存する場合
if (eCheckedItem.Name == "SavePic") {
// 自分自身のディレクトリパス
var eAppDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
// 保存ディレクトリパス
var eSaveDir = Path.Combine(eAppDir, "Pictures");
// フォルダ作成
Directory.CreateDirectory(eSaveDir);
// ファイル作成日
var eCreateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
// 保存ファイルパス生成
var eSaveFilePath = Path.Combine(eSaveDir, $"Pict_{eCreateTime}.png");
// すでに存在する場合
if (File.Exists(eSaveFilePath)) {
// ファイルを削除
SafeDeleteFile(eSaveFilePath);
}
// 画像ファイルをPNGで保存する
eBitmap.Save(eSaveFilePath, ImageFormat.Png);
}
// 後片付け
eBitmap.Dispose();
}
}
catch (Exception eException) {
// デバッグログ出力
Debug.WriteLine(eException.Message);
}
}
/// <summary>
/// モード切替メニュークリック処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnMode_Click(object sender, EventArgs e) {
foreach (var eMenuItem in MenuGroupItems) {
// クリックされた項目とリストの項目が同じ場合
if (object.ReferenceEquals(eMenuItem, sender)) {
// メニュー項目にチェックを入れる
eMenuItem.CheckState = CheckState.Checked;
}
else {
// 上記以外はチェックを外す
eMenuItem.CheckState = CheckState.Unchecked;
}
}
}
/// <summary>
/// 保存フォルダを開くメニュークリック処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnDirOpen_Click(object sender, EventArgs e) {
// 自分自身のディレクトリパス
var eAppDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
// 保存ディレクトリパス
var eSaveDir = Path.Combine(eAppDir, "Pictures");
// フォルダ作成
Directory.CreateDirectory(eSaveDir);
// 保存フォルダを開く
Process.Start(eSaveDir);
}
/// <summary>
/// 終了メニュークリック処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnClose_Click(object sender, EventArgs e) {
// アイコンを明示的に終了
AppIcon.Dispose();
// アプリケーションを終了
Application.Exit();
}
/// <summary>
/// 対象キーが押し続けられている場合trueを返却する
/// </summary>
/// <param name="pKeyCode"></param>
/// <returns></returns>
private bool IsKeyPress(Keys pKeyCode) {
var eResult = false;
// Keyを数値に変換
var eKeyCode = (int)pKeyCode;
// 最上位ビットが1か否かでキー押下の有無を取得
var eState = WindowsAPI.GetKeyState((int)pKeyCode);
// 判定結果
eResult = eState < 0;
return eResult;
}
/// <summary>
/// メニュー項目作成
/// </summary>
/// <returns></returns>
private ContextMenuStrip CreateMenu() {
// 右クリックメニュー
var eResult = new ContextMenuStrip();
// メニュー項目 クリップボードにコピー
var eMenuItemClipBoard = new ToolStripMenuItem();
eMenuItemClipBoard.Name = "ClipBoard";
eMenuItemClipBoard.Text = "&クリップボードにコピーする";
eMenuItemClipBoard.Checked = true;
eMenuItemClipBoard.Click += new EventHandler(OnMode_Click);
MenuGroupItems.Add(eMenuItemClipBoard);
// メニュー項目 画像を保存する
var eMenuItemSavePic = new ToolStripMenuItem();
eMenuItemSavePic.Name = "SavePic";
eMenuItemSavePic.Text = "&画像を保存する";
eMenuItemSavePic.Checked = false;
eMenuItemSavePic.Click += new EventHandler(OnMode_Click);
MenuGroupItems.Add(eMenuItemSavePic);
// メニュー項目 保存フォルダを開く
var eMenuItemDirOpen = new ToolStripMenuItem();
eMenuItemDirOpen.Text = "&保存フォルダを開く";
eMenuItemDirOpen.Click += new EventHandler(OnDirOpen_Click);
// メニュー項目 終了
var eMenuItemClose = new ToolStripMenuItem();
eMenuItemClose.Text = "&終了";
eMenuItemClose.Click += new EventHandler(OnClose_Click);
// 右クリックメニューに追加
eResult.Items.Add(eMenuItemClipBoard);
eResult.Items.Add(eMenuItemSavePic);
eResult.Items.Add(eMenuItemDirOpen);
eResult.Items.Add(eMenuItemClose);
return eResult;
}
/// <summary>
/// ファイル削除処理
/// </summary>
/// <param name="pFilePath"></param>
private void SafeDeleteFile(string pFilePath) {
// 引数がnullの場合
if (string.IsNullOrEmpty(pFilePath)) {
return;
}
// ファイルパスからFileInfoを生成
var eFileInfo = new FileInfo(pFilePath);
// ファイルが存在する場合
if (eFileInfo.Exists) {
// 読み取り専用の場合
if ((eFileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) {
// 読み取り専用を解除
eFileInfo.Attributes = FileAttributes.Normal;
}
}
// ファイル削除
eFileInfo.Delete();
}
}
}