Final revision

Signed-off-by: Lev Rusanov <30170278+JDM170@users.noreply.github.com>
This commit is contained in:
2025-06-09 20:46:31 +07:00
parent 09cee74f0c
commit 594217203d
6 changed files with 137 additions and 135 deletions

38
MainForm.Designer.cs generated
View File

@@ -32,8 +32,7 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.showToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toggleHotkeyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.disablePrintScreenCaptureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.contextMenuStrip1.SuspendLayout();
@@ -43,33 +42,26 @@
//
this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
this.notifyIcon1.Text = "notifyIcon1";
this.notifyIcon1.Text = "ScreenCaptureApp";
this.notifyIcon1.Visible = true;
this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseClick);
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.showToolStripMenuItem,
this.toggleHotkeyToolStripMenuItem,
this.disablePrintScreenCaptureToolStripMenuItem,
this.toolStripSeparator1,
this.exitToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(222, 76);
this.contextMenuStrip1.Size = new System.Drawing.Size(222, 54);
this.contextMenuStrip1.Text = "test";
//
// showToolStripMenuItem
// disablePrintScreenCaptureToolStripMenuItem
//
this.showToolStripMenuItem.Name = "showToolStripMenuItem";
this.showToolStripMenuItem.Size = new System.Drawing.Size(221, 22);
this.showToolStripMenuItem.Text = "Show in Taskbar";
this.showToolStripMenuItem.Click += new System.EventHandler(this.showToolStripMenuItem_Click);
//
// toggleHotkeyToolStripMenuItem
//
this.toggleHotkeyToolStripMenuItem.Name = "toggleHotkeyToolStripMenuItem";
this.toggleHotkeyToolStripMenuItem.Size = new System.Drawing.Size(221, 22);
this.toggleHotkeyToolStripMenuItem.Text = "Disable Print Screen capture";
this.toggleHotkeyToolStripMenuItem.Click += new System.EventHandler(this.toggleHotkeyToolStripMenuItem_Click);
this.disablePrintScreenCaptureToolStripMenuItem.Name = "disablePrintScreenCaptureToolStripMenuItem";
this.disablePrintScreenCaptureToolStripMenuItem.Size = new System.Drawing.Size(221, 22);
this.disablePrintScreenCaptureToolStripMenuItem.Text = "Disable Print Screen capture";
this.disablePrintScreenCaptureToolStripMenuItem.Click += new System.EventHandler(this.toggleHotkeyToolStripMenuItem_Click);
//
// toolStripSeparator1
//
@@ -87,23 +79,23 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(339, 186);
this.ClientSize = new System.Drawing.Size(184, 61);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Name = "MainForm";
this.Text = "MainForm";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.Load += new System.EventHandler(this.MainForm_Load);
this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.NotifyIcon notifyIcon1;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem toggleHotkeyToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem showToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem disablePrintScreenCaptureToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
}
}

View File

@@ -1,7 +1,6 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace ScreenCaptureApp
{
@@ -20,34 +19,11 @@ namespace ScreenCaptureApp
public MainForm()
{
InitializeComponent();
RegisterHotkey();
this.Hide(); // Сразу скрываем основное окно
}
private void ShowMainWindow()
{
if (this.WindowState == FormWindowState.Minimized)
{
this.WindowState = FormWindowState.Normal;
}
this.Show();
this.Activate();
}
private void RegisterHotkey()
{
// Регистрируем Print Screen (0x2C) без модификаторов (0x0)
if (!RegisterHotKey(this.Handle, PRINT_SCREEN_ID, 0x0, 0x2C))
{
MessageBox.Show("Failed to register Print Screen hotkey", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
notifyIcon1.ShowBalloonTip(1000, "Error", "Failed to register Print Screen hotkey", ToolTipIcon.Error);
}
}
private void ExitApplication()
{
UnregisterHotKey(this.Handle, PRINT_SCREEN_ID);
notifyIcon1.Visible = false;
Application.Exit();
this.WindowState = FormWindowState.Minimized;
}
protected override void WndProc(ref Message m)
@@ -64,51 +40,35 @@ namespace ScreenCaptureApp
private void CaptureScreen()
{
this.Hide();
using (var captureForm = new ScreenCaptureForm())
using (ScreenCaptureForm captureForm = new ScreenCaptureForm())
{
captureForm.Focus();
if (captureForm.ShowDialog() == DialogResult.OK)
{
ProcessCapturedImage(captureForm.CapturedImage);
}
}
this.Show();
}
private void ProcessCapturedImage(Image image)
using (captureForm.CapturedImage)
{
using (var resultForm = new ResultForm(image))
using (ResultForm resultForm = new ResultForm(captureForm.CapturedImage))
{
var result = resultForm.ShowDialog();
if (result == DialogResult.OK)
if (resultForm.ShowDialog() == DialogResult.OK)
{
SaveImage(image);
}
else if (result == DialogResult.Yes)
{
CopyToClipboard(image);
}
}
}
private void SaveImage(Image image)
{
using (var sfd = new SaveFileDialog())
using (SaveFileDialog sfd = new SaveFileDialog())
{
sfd.Title = "Save screenshot";
sfd.Filter = "PNG Image|*.png|JPEG Image|*.jpg|Bitmap Image|*.bmp";
sfd.FileName = $"screenshot_{DateTime.Now:dd-MM-yyyy_HH.mm.ss}";
if (sfd.ShowDialog() == DialogResult.OK)
{
image.Save(sfd.FileName, GetImageFormat(sfd.FileName));
captureForm.CapturedImage.Save(sfd.FileName, GetImageFormat(sfd.FileName));
notifyIcon1.ShowBalloonTip(1000, "Success", "Screenshot saved!", ToolTipIcon.Info);
}
}
}
private void CopyToClipboard(Image image)
else if (resultForm.DialogResult == DialogResult.Yes)
{
try
{
Clipboard.SetImage(image);
Clipboard.SetImage(captureForm.CapturedImage);
notifyIcon1.ShowBalloonTip(1000, "Success", "Copied to clipboard!", ToolTipIcon.Info);
}
catch (Exception ex)
@@ -116,6 +76,11 @@ namespace ScreenCaptureApp
notifyIcon1.ShowBalloonTip(1000, "Error", $"Copy failed: {ex.Message}", ToolTipIcon.Error);
}
}
}
}
}
}
}
private System.Drawing.Imaging.ImageFormat GetImageFormat(string fileName)
{
@@ -129,35 +94,52 @@ namespace ScreenCaptureApp
}
}
private void notifyIcon1_MouseClick(object sender, EventArgs e) => ShowMainWindow();
private void MainForm_Load(object sender, EventArgs e)
{
disablePrintScreenCaptureToolStripMenuItem.Text = $"Print Screen Capture: {(captureOnKeyPress ? "ON" : "OFF")}";
this.Hide();
}
private void showToolStripMenuItem_Click(object sender, EventArgs e) => ShowMainWindow();
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
UnregisterHotKey(this.Handle, PRINT_SCREEN_ID);
notifyIcon1.Visible = false;
this.Dispose(true);
}
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
MethodInvoker mi = new MethodInvoker(() => {
notifyIcon1.ContextMenuStrip.Show(Cursor.Position);
});
this.BeginInvoke(mi);
}
else if (e.Button == MouseButtons.Left)
{
CaptureScreen();
}
}
private void toggleHotkeyToolStripMenuItem_Click(object sender, EventArgs e)
{
captureOnKeyPress = !captureOnKeyPress;
var item = (ToolStripMenuItem)sender;
item.Text = $"Print Screen Capture: {(captureOnKeyPress ? "ON" : "OFF")}";
notifyIcon1.ShowBalloonTip(1000, "Hotkey",
$"Print Screen capture {(captureOnKeyPress ? "enabled" : "disabled")}",
disablePrintScreenCaptureToolStripMenuItem.Text = $"Print Screen Capture: {(captureOnKeyPress ? "ON" : "OFF")}";
notifyIcon1.ShowBalloonTip(250, "Screen Capture",
captureOnKeyPress ? "Print Screen capture enabled" : "Print Screen capture disabled",
ToolTipIcon.Info);
}
private void exitToolStripMenuItem_Click(Object sender, EventArgs e)
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
ExitApplication();
base.OnFormClosing(e as FormClosingEventArgs);
Application.Exit();
}
protected override void OnLoad(EventArgs e)
private void bigButton_Click(object sender, EventArgs e)
{
base.OnLoad(e);
this.Hide(); // Гарантированно скрываем окно при загрузке
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
ExitApplication();
CaptureScreen();
}
}
}

View File

@@ -118,10 +118,10 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>132, 17</value>
<value>17, 13</value>
</metadata>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>246, 17</value>
<value>131, 13</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="notifyIcon1.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

57
ResultForm.Designer.cs generated
View File

@@ -32,23 +32,29 @@
this.btnSave = new System.Windows.Forms.Button();
this.btnCopy = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(12, 12);
this.tableLayoutPanel1.SetColumnSpan(this.pictureBox1, 4);
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Location = new System.Drawing.Point(3, 3);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(716, 346);
this.pictureBox1.Size = new System.Drawing.Size(793, 530);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// btnSave
//
this.btnSave.Location = new System.Drawing.Point(491, 364);
this.btnSave.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnSave.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.btnSave.Location = new System.Drawing.Point(433, 539);
this.btnSave.Name = "btnSave";
this.btnSave.Size = new System.Drawing.Size(75, 23);
this.btnSave.Size = new System.Drawing.Size(117, 29);
this.btnSave.TabIndex = 1;
this.btnSave.Text = "Save";
this.btnSave.UseVisualStyleBackColor = true;
@@ -56,9 +62,11 @@
//
// btnCopy
//
this.btnCopy.Location = new System.Drawing.Point(572, 364);
this.btnCopy.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnCopy.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.btnCopy.Location = new System.Drawing.Point(556, 539);
this.btnCopy.Name = "btnCopy";
this.btnCopy.Size = new System.Drawing.Size(75, 23);
this.btnCopy.Size = new System.Drawing.Size(116, 29);
this.btnCopy.TabIndex = 2;
this.btnCopy.Text = "Copy";
this.btnCopy.UseVisualStyleBackColor = true;
@@ -66,27 +74,47 @@
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(653, 364);
this.btnCancel.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnCancel.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.btnCancel.Location = new System.Drawing.Point(678, 539);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.Size = new System.Drawing.Size(118, 29);
this.btnCancel.TabIndex = 3;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 4;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 53.86703F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 15.46811F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 15.33243F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 15.19674F));
this.tableLayoutPanel1.Controls.Add(this.btnCancel, 3, 1);
this.tableLayoutPanel1.Controls.Add(this.btnCopy, 2, 1);
this.tableLayoutPanel1.Controls.Add(this.btnSave, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.pictureBox1, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 93.95866F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 6.041336F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(799, 571);
this.tableLayoutPanel1.TabIndex = 4;
//
// ResultForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(737, 396);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.btnCopy);
this.Controls.Add(this.btnSave);
this.Controls.Add(this.pictureBox1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.ClientSize = new System.Drawing.Size(799, 571);
this.Controls.Add(this.tableLayoutPanel1);
this.Name = "ResultForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "ResultForm";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.tableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
@@ -97,5 +125,6 @@
private System.Windows.Forms.Button btnSave;
private System.Windows.Forms.Button btnCopy;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
}
}

View File

@@ -4,7 +4,7 @@ using System.Windows.Forms;
namespace ScreenCaptureApp
{
public partial class ResultForm : Form
public partial class ResultForm : Form, IDisposable
{
public ResultForm(Image capturedImage)
{

View File

@@ -5,7 +5,7 @@ using System.Windows.Forms;
namespace ScreenCaptureApp
{
public sealed class ScreenCaptureForm : Form
public partial class ScreenCaptureForm : Form
{
private Point _startPoint;
private Point _endPoint;
@@ -46,7 +46,7 @@ namespace ScreenCaptureApp
Screen.PrimaryScreen.Bounds.Height,
PixelFormat.Format32bppArgb);
using (var g = Graphics.FromImage(_screenBitmap))
using (Graphics g = Graphics.FromImage(_screenBitmap))
{
g.CopyFromScreen(
Screen.PrimaryScreen.Bounds.X,
@@ -100,10 +100,9 @@ namespace ScreenCaptureApp
{
if (_isSelecting)
{
var rect = GetSelectionRectangle();
Rectangle rect = GetSelectionRectangle();
e.Graphics.DrawRectangle(_selectionPen, rect);
// Перекрестие для точного выбора
e.Graphics.DrawLine(_selectionPen,
new Point(rect.X, rect.Y + rect.Height / 2),
new Point(rect.X + rect.Width, rect.Y + rect.Height / 2));
@@ -137,7 +136,7 @@ namespace ScreenCaptureApp
{
CapturedImage = new Bitmap(_selectedRegion.Width, _selectedRegion.Height);
using (var g = Graphics.FromImage(CapturedImage))
using (Graphics g = Graphics.FromImage(CapturedImage))
{
g.DrawImage(_screenBitmap,
new Rectangle(0, 0, _selectedRegion.Width, _selectedRegion.Height),