Stuffs
This commit is contained in:
parent
16a91e0ee9
commit
cd89f30f6d
@ -61,6 +61,9 @@
|
||||
<Compile Include="HID.cs" />
|
||||
<Compile Include="IO.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="RotatingIndicator.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Security.cs" />
|
||||
<Compile Include="SelectBox.cs">
|
||||
<SubType>Form</SubType>
|
||||
|
153
Misc/RotatingIndicator.cs
Normal file
153
Misc/RotatingIndicator.cs
Normal file
@ -0,0 +1,153 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Windows.Forms;
|
||||
using Timer = System.Timers.Timer;
|
||||
|
||||
namespace CC_Functions.Misc
|
||||
{
|
||||
/// <summary>
|
||||
/// Animated control similar to update screens in Windows 8 and 10
|
||||
/// </summary>
|
||||
public sealed class RotatingIndicator : Control
|
||||
{
|
||||
private const double IndicatorOffset = Math.PI / 16;
|
||||
private const int MaximumIndicators = 6;
|
||||
private const int SizeFactor = 20;
|
||||
private const double StartAt = (2 * Math.PI) / 3;
|
||||
private const double TimerInterval = 100.0;
|
||||
private readonly Indicator[] indicators = new Indicator[MaximumIndicators];
|
||||
private readonly Timer timer;
|
||||
private int indicatorCenterRadius;
|
||||
private int indicatorDiameter;
|
||||
|
||||
/// <summary>
|
||||
/// Instantiates the control
|
||||
/// </summary>
|
||||
public RotatingIndicator()
|
||||
{
|
||||
for (int i = 0; i < 6; i++)
|
||||
indicators[i] = new Indicator(StartAt + (i * IndicatorOffset));
|
||||
SetStyle(
|
||||
ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
|
||||
ControlStyles.SupportsTransparentBackColor, true);
|
||||
UpdateStyles();
|
||||
ForeColorChanged += (sender, e) => Invalidate();
|
||||
SizeChanged += (sender, e) =>
|
||||
{
|
||||
int indicatorRadius = (int) Math.Round(Height / (double) SizeFactor);
|
||||
indicatorDiameter = 2 * indicatorRadius;
|
||||
Height = SizeFactor * indicatorRadius;
|
||||
Width = Height;
|
||||
int outerRadius = Height / 2;
|
||||
int innerRadius = outerRadius - indicatorDiameter;
|
||||
indicatorCenterRadius = innerRadius + indicatorRadius;
|
||||
Invalidate();
|
||||
};
|
||||
OnSizeChanged(null);
|
||||
timer = new Timer();
|
||||
timer.Elapsed += (sender, e) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
if (InvokeRequired)
|
||||
Invoke((Action) Refresh);
|
||||
else Refresh();
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
};
|
||||
timer.Interval = TimerInterval;
|
||||
timer.Enabled = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start/stops indicator animation
|
||||
/// </summary>
|
||||
[Category("Appearance")]
|
||||
[Description("Start/stops indicator animation")]
|
||||
[DefaultValue(true)]
|
||||
[Bindable(true)]
|
||||
public bool Animate
|
||||
{
|
||||
get => timer.Enabled;
|
||||
set => timer.Enabled = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Specifies indicator rotational refresh
|
||||
/// </summary>
|
||||
[Category("Appearance")]
|
||||
[Description("Specifies indicator rotational refresh")]
|
||||
[DefaultValue(200)]
|
||||
[Bindable(true)]
|
||||
public double RefreshRate
|
||||
{
|
||||
get => timer.Interval;
|
||||
set
|
||||
{
|
||||
timer.Interval = Math.Max(Math.Min(value, 200), 10);
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disposes used objects and the control itself
|
||||
/// </summary>
|
||||
/// <param name="disposing"></param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing) timer.Dispose();
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Paints the control and cycles the animation
|
||||
/// </summary>
|
||||
/// <param name="e">Arguments specifying the painting target</param>
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
GraphicsContainer state = e.Graphics.BeginContainer();
|
||||
e.Graphics.TranslateTransform(-Left, -Top);
|
||||
Rectangle clip = e.ClipRectangle;
|
||||
clip.Offset(Left, Top);
|
||||
PaintEventArgs pea = new PaintEventArgs(e.Graphics, clip);
|
||||
InvokePaintBackground(Parent, pea);
|
||||
InvokePaint(Parent, pea);
|
||||
e.Graphics.EndContainer(state);
|
||||
e.Graphics.Clear(BackColor);
|
||||
Brush brush = new SolidBrush(ForeColor);
|
||||
for (int i = MaximumIndicators - 1; i >= 0; i--)
|
||||
{
|
||||
double degrees = indicators[i].Radians;
|
||||
if (degrees < 0.0)
|
||||
degrees += 2 * Math.PI;
|
||||
int dx = (int) Math.Round(indicatorCenterRadius * Math.Cos(degrees)) + indicatorCenterRadius;
|
||||
int dy = indicatorCenterRadius - (int) Math.Round(indicatorCenterRadius * Math.Sin(degrees));
|
||||
e.Graphics.FillEllipse(brush,
|
||||
new Rectangle(new Point(dx, dy), new Size(indicatorDiameter, indicatorDiameter)));
|
||||
degrees -= indicators[i].Speed * IndicatorOffset;
|
||||
if (indicators[i].Speed > 1.0) indicators[i].Speed += 0.25;
|
||||
if (degrees < 0.0) indicators[i].Speed = 1.25;
|
||||
else if (degrees < StartAt) indicators[i].Speed = 1.0;
|
||||
indicators[i].Radians = degrees;
|
||||
}
|
||||
brush.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
internal struct Indicator
|
||||
{
|
||||
public Indicator(double radians)
|
||||
{
|
||||
Radians = radians;
|
||||
Speed = 1.0;
|
||||
}
|
||||
|
||||
public double Radians { get; set; }
|
||||
public double Speed { get; set; }
|
||||
}
|
||||
}
|
82
W32.Test/MainForm.Designer.cs
generated
82
W32.Test/MainForm.Designer.cs
generated
@ -160,8 +160,11 @@
|
||||
//
|
||||
// wnd_action_pos_h_label
|
||||
//
|
||||
this.wnd_action_pos_h_label.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.wnd_action_pos_h_label.AutoSize = true;
|
||||
this.wnd_action_pos_h_label.Location = new System.Drawing.Point(135, 395);
|
||||
this.wnd_action_pos_h_label.Location = new System.Drawing.Point(135, 284);
|
||||
this.wnd_action_pos_h_label.Name = "wnd_action_pos_h_label";
|
||||
this.wnd_action_pos_h_label.Size = new System.Drawing.Size(19, 15);
|
||||
this.wnd_action_pos_h_label.TabIndex = 19;
|
||||
@ -169,8 +172,11 @@
|
||||
//
|
||||
// wnd_action_pos_w_label
|
||||
//
|
||||
this.wnd_action_pos_w_label.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.wnd_action_pos_w_label.AutoSize = true;
|
||||
this.wnd_action_pos_w_label.Location = new System.Drawing.Point(135, 367);
|
||||
this.wnd_action_pos_w_label.Location = new System.Drawing.Point(135, 256);
|
||||
this.wnd_action_pos_w_label.Name = "wnd_action_pos_w_label";
|
||||
this.wnd_action_pos_w_label.Size = new System.Drawing.Size(21, 15);
|
||||
this.wnd_action_pos_w_label.TabIndex = 18;
|
||||
@ -178,22 +184,31 @@
|
||||
//
|
||||
// wnd_action_pos_h_bar
|
||||
//
|
||||
this.wnd_action_pos_h_bar.Location = new System.Drawing.Point(159, 395);
|
||||
this.wnd_action_pos_h_bar.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.wnd_action_pos_h_bar.Location = new System.Drawing.Point(159, 284);
|
||||
this.wnd_action_pos_h_bar.Name = "wnd_action_pos_h_bar";
|
||||
this.wnd_action_pos_h_bar.Size = new System.Drawing.Size(121, 45);
|
||||
this.wnd_action_pos_h_bar.TabIndex = 21;
|
||||
//
|
||||
// wnd_action_pos_w_bar
|
||||
//
|
||||
this.wnd_action_pos_w_bar.Location = new System.Drawing.Point(159, 367);
|
||||
this.wnd_action_pos_w_bar.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.wnd_action_pos_w_bar.Location = new System.Drawing.Point(159, 256);
|
||||
this.wnd_action_pos_w_bar.Name = "wnd_action_pos_w_bar";
|
||||
this.wnd_action_pos_w_bar.Size = new System.Drawing.Size(121, 45);
|
||||
this.wnd_action_pos_w_bar.TabIndex = 20;
|
||||
//
|
||||
// wnd_action_pos_y_label
|
||||
//
|
||||
this.wnd_action_pos_y_label.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.wnd_action_pos_y_label.AutoSize = true;
|
||||
this.wnd_action_pos_y_label.Location = new System.Drawing.Point(7, 395);
|
||||
this.wnd_action_pos_y_label.Location = new System.Drawing.Point(7, 284);
|
||||
this.wnd_action_pos_y_label.Name = "wnd_action_pos_y_label";
|
||||
this.wnd_action_pos_y_label.Size = new System.Drawing.Size(17, 15);
|
||||
this.wnd_action_pos_y_label.TabIndex = 15;
|
||||
@ -201,8 +216,11 @@
|
||||
//
|
||||
// wnd_action_pos_x_label
|
||||
//
|
||||
this.wnd_action_pos_x_label.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.wnd_action_pos_x_label.AutoSize = true;
|
||||
this.wnd_action_pos_x_label.Location = new System.Drawing.Point(7, 367);
|
||||
this.wnd_action_pos_x_label.Location = new System.Drawing.Point(7, 256);
|
||||
this.wnd_action_pos_x_label.Name = "wnd_action_pos_x_label";
|
||||
this.wnd_action_pos_x_label.Size = new System.Drawing.Size(17, 15);
|
||||
this.wnd_action_pos_x_label.TabIndex = 13;
|
||||
@ -210,21 +228,28 @@
|
||||
//
|
||||
// wnd_action_pos_y_bar
|
||||
//
|
||||
this.wnd_action_pos_y_bar.Location = new System.Drawing.Point(20, 395);
|
||||
this.wnd_action_pos_y_bar.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.wnd_action_pos_y_bar.Location = new System.Drawing.Point(20, 284);
|
||||
this.wnd_action_pos_y_bar.Name = "wnd_action_pos_y_bar";
|
||||
this.wnd_action_pos_y_bar.Size = new System.Drawing.Size(121, 45);
|
||||
this.wnd_action_pos_y_bar.TabIndex = 17;
|
||||
//
|
||||
// wnd_action_pos_x_bar
|
||||
//
|
||||
this.wnd_action_pos_x_bar.Location = new System.Drawing.Point(20, 367);
|
||||
this.wnd_action_pos_x_bar.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.wnd_action_pos_x_bar.Location = new System.Drawing.Point(20, 256);
|
||||
this.wnd_action_pos_x_bar.Name = "wnd_action_pos_x_bar";
|
||||
this.wnd_action_pos_x_bar.Size = new System.Drawing.Size(121, 45);
|
||||
this.wnd_action_pos_x_bar.TabIndex = 16;
|
||||
//
|
||||
// wnd_action_pos
|
||||
//
|
||||
this.wnd_action_pos.Location = new System.Drawing.Point(101, 337);
|
||||
this.wnd_action_pos.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
|
||||
this.wnd_action_pos.Location = new System.Drawing.Point(101, 226);
|
||||
this.wnd_action_pos.Name = "wnd_action_pos";
|
||||
this.wnd_action_pos.Size = new System.Drawing.Size(87, 27);
|
||||
this.wnd_action_pos.TabIndex = 14;
|
||||
@ -349,7 +374,8 @@
|
||||
//
|
||||
// wnd_action_destroy
|
||||
//
|
||||
this.wnd_action_destroy.Location = new System.Drawing.Point(7, 337);
|
||||
this.wnd_action_destroy.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
|
||||
this.wnd_action_destroy.Location = new System.Drawing.Point(7, 226);
|
||||
this.wnd_action_destroy.Name = "wnd_action_destroy";
|
||||
this.wnd_action_destroy.Size = new System.Drawing.Size(87, 27);
|
||||
this.wnd_action_destroy.TabIndex = 2;
|
||||
@ -359,7 +385,8 @@
|
||||
//
|
||||
// wnd_action_front
|
||||
//
|
||||
this.wnd_action_front.Location = new System.Drawing.Point(196, 337);
|
||||
this.wnd_action_front.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
|
||||
this.wnd_action_front.Location = new System.Drawing.Point(196, 226);
|
||||
this.wnd_action_front.Name = "wnd_action_front";
|
||||
this.wnd_action_front.Size = new System.Drawing.Size(84, 27);
|
||||
this.wnd_action_front.TabIndex = 10;
|
||||
@ -369,8 +396,11 @@
|
||||
//
|
||||
// wnd_action_enabled
|
||||
//
|
||||
this.wnd_action_enabled.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.wnd_action_enabled.AutoSize = true;
|
||||
this.wnd_action_enabled.Location = new System.Drawing.Point(7, 275);
|
||||
this.wnd_action_enabled.Location = new System.Drawing.Point(7, 167);
|
||||
this.wnd_action_enabled.Name = "wnd_action_enabled";
|
||||
this.wnd_action_enabled.Size = new System.Drawing.Size(68, 19);
|
||||
this.wnd_action_enabled.TabIndex = 9;
|
||||
@ -380,7 +410,10 @@
|
||||
//
|
||||
// wnd_action_title_get
|
||||
//
|
||||
this.wnd_action_title_get.Location = new System.Drawing.Point(237, 270);
|
||||
this.wnd_action_title_get.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.wnd_action_title_get.Location = new System.Drawing.Point(237, 159);
|
||||
this.wnd_action_title_get.Name = "wnd_action_title_get";
|
||||
this.wnd_action_title_get.Size = new System.Drawing.Size(43, 27);
|
||||
this.wnd_action_title_get.TabIndex = 8;
|
||||
@ -474,7 +507,7 @@
|
||||
this.wnd.Controls.Add(this.wnd_select_self);
|
||||
this.wnd.Location = new System.Drawing.Point(14, 135);
|
||||
this.wnd.Name = "wnd";
|
||||
this.wnd.Size = new System.Drawing.Size(287, 456);
|
||||
this.wnd.Size = new System.Drawing.Size(287, 345);
|
||||
this.wnd.TabIndex = 6;
|
||||
this.wnd.TabStop = false;
|
||||
this.wnd.Text = "CC-Functions.W32.Wnd32";
|
||||
@ -491,8 +524,11 @@
|
||||
//
|
||||
// wnd_action_overlay
|
||||
//
|
||||
this.wnd_action_overlay.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.wnd_action_overlay.AutoSize = true;
|
||||
this.wnd_action_overlay.Location = new System.Drawing.Point(162, 275);
|
||||
this.wnd_action_overlay.Location = new System.Drawing.Point(162, 167);
|
||||
this.wnd_action_overlay.Name = "wnd_action_overlay";
|
||||
this.wnd_action_overlay.Size = new System.Drawing.Size(66, 19);
|
||||
this.wnd_action_overlay.TabIndex = 25;
|
||||
@ -502,9 +538,13 @@
|
||||
//
|
||||
// wnd_action_style
|
||||
//
|
||||
this.wnd_action_style.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left) |
|
||||
System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.wnd_action_style.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.wnd_action_style.FormattingEnabled = true;
|
||||
this.wnd_action_style.Location = new System.Drawing.Point(7, 306);
|
||||
this.wnd_action_style.Location = new System.Drawing.Point(7, 195);
|
||||
this.wnd_action_style.Name = "wnd_action_style";
|
||||
this.wnd_action_style.Size = new System.Drawing.Size(238, 23);
|
||||
this.wnd_action_style.TabIndex = 24;
|
||||
@ -513,8 +553,11 @@
|
||||
//
|
||||
// wnd_action_visible
|
||||
//
|
||||
this.wnd_action_visible.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.wnd_action_visible.AutoSize = true;
|
||||
this.wnd_action_visible.Location = new System.Drawing.Point(90, 275);
|
||||
this.wnd_action_visible.Location = new System.Drawing.Point(90, 167);
|
||||
this.wnd_action_visible.Name = "wnd_action_visible";
|
||||
this.wnd_action_visible.Size = new System.Drawing.Size(60, 19);
|
||||
this.wnd_action_visible.TabIndex = 23;
|
||||
@ -524,9 +567,12 @@
|
||||
//
|
||||
// wnd_action_icon
|
||||
//
|
||||
this.wnd_action_icon.Anchor =
|
||||
((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom |
|
||||
System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.wnd_action_icon.BackColor = System.Drawing.SystemColors.ControlLight;
|
||||
this.wnd_action_icon.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
|
||||
this.wnd_action_icon.Location = new System.Drawing.Point(253, 303);
|
||||
this.wnd_action_icon.Location = new System.Drawing.Point(253, 193);
|
||||
this.wnd_action_icon.Name = "wnd_action_icon";
|
||||
this.wnd_action_icon.Size = new System.Drawing.Size(27, 27);
|
||||
this.wnd_action_icon.TabIndex = 22;
|
||||
|
@ -12,26 +12,18 @@ namespace CC_Functions.W32.Test
|
||||
public partial class MainForm : Form
|
||||
{
|
||||
private static Wnd32 tmpWnd32_obj;
|
||||
private Wnd32 tmpWnd
|
||||
{
|
||||
get => tmpWnd32_obj;
|
||||
set {
|
||||
tmpWnd32_obj = value;
|
||||
Wnd_action_title_get_Click(null, null);
|
||||
}
|
||||
}
|
||||
private static MainForm mainF;
|
||||
private static Form frm;
|
||||
private static Label lab;
|
||||
private readonly KeyboardHook kHook;
|
||||
private readonly MouseHook mHook;
|
||||
Label[] readerLabels;
|
||||
private readonly Label[] readerLabels;
|
||||
|
||||
public MainForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
mainF = this;
|
||||
tmpWnd32_obj = Wnd32.fromForm(this);
|
||||
tmpWnd32_obj = Wnd32.FromForm(this);
|
||||
#if DEBUG
|
||||
tmpWnd32_obj.MakeOverlay();
|
||||
#endif
|
||||
@ -45,7 +37,7 @@ namespace CC_Functions.W32.Test
|
||||
wnd_action_pos_w_bar.Maximum = Screen.PrimaryScreen.Bounds.Width;
|
||||
wnd_action_pos_h_bar.Maximum = Screen.PrimaryScreen.Bounds.Height;
|
||||
wnd_action_style.DataSource = Enum.GetValues(typeof(FormWindowState));
|
||||
wnd_action_style.SelectedItem = tmpWnd32_obj.state;
|
||||
wnd_action_style.SelectedItem = tmpWnd32_obj.State;
|
||||
readerLabels = Enum.GetValues(typeof(Keys)).OfType<Keys>().OrderBy(s => s.ToString()).Select(s =>
|
||||
{
|
||||
Label lab = new Label {Tag = s};
|
||||
@ -57,6 +49,16 @@ namespace CC_Functions.W32.Test
|
||||
screen_get_Click(null, null);
|
||||
}
|
||||
|
||||
private Wnd32 tmpWnd
|
||||
{
|
||||
get => tmpWnd32_obj;
|
||||
set
|
||||
{
|
||||
tmpWnd32_obj = value;
|
||||
Wnd_action_title_get_Click(null, null);
|
||||
}
|
||||
}
|
||||
|
||||
public void set_up_box(ComboBox box, Type enumT)
|
||||
{
|
||||
box.DataSource = Enum.GetNames(enumT);
|
||||
@ -72,32 +74,36 @@ namespace CC_Functions.W32.Test
|
||||
|
||||
public object get_box_value(ComboBox box) => ((object[]) box.Tag)[box.SelectedIndex];
|
||||
|
||||
private void Power_execute_Click(object sender, EventArgs e) => RaiseEvent((ShutdownMode)get_box_value(power_mode_box), (ShutdownReason)get_box_value(power_reason_box),
|
||||
private void Power_execute_Click(object sender, EventArgs e) => RaiseEvent(
|
||||
(ShutdownMode) get_box_value(power_mode_box), (ShutdownReason) get_box_value(power_reason_box),
|
||||
(ShutdownMod) get_box_value(power_mod_box));
|
||||
|
||||
private void Wnd_select_self_Click(object sender, EventArgs e) => tmpWnd = Wnd32.fromForm(this);
|
||||
private void Wnd_select_self_Click(object sender, EventArgs e) => tmpWnd = Wnd32.FromForm(this);
|
||||
|
||||
private void wnd_select_list_Click(object sender, EventArgs e) => tmpWnd = SelectBox.Show(Wnd32.Visible, "Please select a window") ?? tmpWnd;
|
||||
private void wnd_select_list_Click(object sender, EventArgs e) =>
|
||||
tmpWnd = SelectBox.Show(Wnd32.Visible, "Please select a window") ?? tmpWnd;
|
||||
|
||||
private void Wnd_select_title_button_Click(object sender, EventArgs e) => tmpWnd = Wnd32.fromMetadata(null, wnd_select_title_box.Text);
|
||||
private void Wnd_select_title_button_Click(object sender, EventArgs e) =>
|
||||
tmpWnd = Wnd32.FromMetadata(null, wnd_select_title_box.Text);
|
||||
|
||||
private void Wnd_selet_class_button_Click(object sender, EventArgs e) => tmpWnd = Wnd32.fromMetadata(wnd_select_class_box.Text);
|
||||
private void Wnd_selet_class_button_Click(object sender, EventArgs e) =>
|
||||
tmpWnd = Wnd32.FromMetadata(wnd_select_class_box.Text);
|
||||
|
||||
private void Wnd_action_title_set_Click(object sender, EventArgs e) => tmpWnd.title = wnd_select_title_box.Text;
|
||||
private void Wnd_action_title_set_Click(object sender, EventArgs e) => tmpWnd.Title = wnd_select_title_box.Text;
|
||||
|
||||
private void Wnd_action_title_get_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (!tmpWnd.stillExists)
|
||||
tmpWnd = Wnd32.fromForm(this);
|
||||
wnd_select_title_box.Text = tmpWnd.title;
|
||||
wnd_action_enabled.Checked = tmpWnd.enabled;
|
||||
wnd_select_selected.Text = "Selected: " + tmpWnd.hWnd;
|
||||
wnd_action_style.SelectedIndex = (int) tmpWnd.state;
|
||||
wnd_select_class_box.Text = tmpWnd.className;
|
||||
wnd_action_visible.Checked = tmpWnd.shown;
|
||||
if (!tmpWnd.StillExists)
|
||||
tmpWnd = Wnd32.FromForm(this);
|
||||
wnd_select_title_box.Text = tmpWnd.Title;
|
||||
wnd_action_enabled.Checked = tmpWnd.Enabled;
|
||||
wnd_select_selected.Text = "Selected: " + tmpWnd.HWnd;
|
||||
wnd_action_style.SelectedIndex = (int) tmpWnd.State;
|
||||
wnd_select_class_box.Text = tmpWnd.ClassName;
|
||||
wnd_action_visible.Checked = tmpWnd.Shown;
|
||||
try
|
||||
{
|
||||
wnd_action_icon.BackgroundImage = tmpWnd.icon.ToBitmap();
|
||||
wnd_action_icon.BackgroundImage = tmpWnd.Icon.ToBitmap();
|
||||
}
|
||||
catch
|
||||
{
|
||||
@ -106,7 +112,7 @@ namespace CC_Functions.W32.Test
|
||||
|
||||
try
|
||||
{
|
||||
wnd_action_pos_x_bar.Value = tmpWnd.position.X;
|
||||
wnd_action_pos_x_bar.Value = tmpWnd.Position.X;
|
||||
}
|
||||
catch
|
||||
{
|
||||
@ -114,7 +120,7 @@ namespace CC_Functions.W32.Test
|
||||
|
||||
try
|
||||
{
|
||||
wnd_action_pos_y_bar.Value = tmpWnd.position.Y;
|
||||
wnd_action_pos_y_bar.Value = tmpWnd.Position.Y;
|
||||
}
|
||||
catch
|
||||
{
|
||||
@ -122,7 +128,7 @@ namespace CC_Functions.W32.Test
|
||||
|
||||
try
|
||||
{
|
||||
wnd_action_pos_w_bar.Value = tmpWnd.position.Width;
|
||||
wnd_action_pos_w_bar.Value = tmpWnd.Position.Width;
|
||||
}
|
||||
catch
|
||||
{
|
||||
@ -130,7 +136,7 @@ namespace CC_Functions.W32.Test
|
||||
|
||||
try
|
||||
{
|
||||
wnd_action_pos_h_bar.Value = tmpWnd.position.Height;
|
||||
wnd_action_pos_h_bar.Value = tmpWnd.Position.Height;
|
||||
}
|
||||
catch
|
||||
{
|
||||
@ -138,20 +144,20 @@ namespace CC_Functions.W32.Test
|
||||
}
|
||||
|
||||
private void Wnd_action_enabled_CheckedChanged(object sender, EventArgs e) =>
|
||||
tmpWnd.enabled = wnd_action_enabled.Checked;
|
||||
tmpWnd.Enabled = wnd_action_enabled.Checked;
|
||||
|
||||
private void Wnd_action_visible_CheckedChanged(object sender, EventArgs e) =>
|
||||
tmpWnd.shown = wnd_action_visible.Checked;
|
||||
tmpWnd.Shown = wnd_action_visible.Checked;
|
||||
|
||||
private void Wnd_action_front_Click(object sender, EventArgs e) => tmpWnd.isForeground = true;
|
||||
private void Wnd_action_front_Click(object sender, EventArgs e) => tmpWnd.IsForeground = true;
|
||||
|
||||
private void Wnd_action_destroy_Click(object sender, EventArgs e) => tmpWnd.Destroy();
|
||||
|
||||
private void Wnd_select_mouse_Click(object sender, EventArgs e)
|
||||
{
|
||||
WindowState = FormWindowState.Minimized;
|
||||
tmpWnd = Wnd32.fromForm(this);
|
||||
tmpWnd.enabled = false;
|
||||
tmpWnd = Wnd32.FromForm(this);
|
||||
tmpWnd.Enabled = false;
|
||||
frm = new Form();
|
||||
frm.BackColor = Color.White;
|
||||
frm.Opacity = 0.4f;
|
||||
@ -162,16 +168,16 @@ namespace CC_Functions.W32.Test
|
||||
lab = new Label();
|
||||
frm.Controls.Add(lab);
|
||||
frm.Show();
|
||||
Wnd32.fromForm(frm).overlay = true;
|
||||
Wnd32.FromForm(frm).Overlay = true;
|
||||
}
|
||||
|
||||
private void Frm_Click(object sender, EventArgs e)
|
||||
{
|
||||
frm.Hide();
|
||||
frm.WindowState = FormWindowState.Minimized;
|
||||
Wnd32 tmp = Wnd32.fromPoint(MousePosition);
|
||||
tmpWnd.enabled = true;
|
||||
tmpWnd.isForeground = true;
|
||||
Wnd32 tmp = Wnd32.FromPoint(MousePosition);
|
||||
tmpWnd.Enabled = true;
|
||||
tmpWnd.IsForeground = true;
|
||||
tmpWnd = tmp;
|
||||
mainF.WindowState = FormWindowState.Normal;
|
||||
frm.Close();
|
||||
@ -179,7 +185,7 @@ namespace CC_Functions.W32.Test
|
||||
|
||||
private void Frm_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
lab.Text = Wnd32.fromPoint(MousePosition).ToString();
|
||||
lab.Text = Wnd32.FromPoint(MousePosition).ToString();
|
||||
lab.Location = new Point(Cursor.Position.X + 5, Cursor.Position.Y + 5);
|
||||
}
|
||||
|
||||
@ -194,7 +200,8 @@ namespace CC_Functions.W32.Test
|
||||
private void MHook_OnMouse(MouseHookEventArgs args) =>
|
||||
mouse_log.Text = args.Message + " -|- " + args.Point + "\r\n" + mouse_log.Text;
|
||||
|
||||
private void Mouse_log_TextChanged(object sender, EventArgs e) => mouse_log.Lines = mouse_log.Lines.Take(9).ToArray();
|
||||
private void Mouse_log_TextChanged(object sender, EventArgs e) =>
|
||||
mouse_log.Lines = mouse_log.Lines.Take(9).ToArray();
|
||||
|
||||
private void Keyboard_enabled_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
@ -207,20 +214,21 @@ namespace CC_Functions.W32.Test
|
||||
private void KHook_OnKeyPress(KeyboardHookEventArgs args) =>
|
||||
keyboard_log.Text = args.Key + "\r\n" + keyboard_log.Text;
|
||||
|
||||
private void Keyboard_log_TextChanged(object sender, EventArgs e) => keyboard_log.Lines = keyboard_log.Lines.Take(8).ToArray();
|
||||
private void Keyboard_log_TextChanged(object sender, EventArgs e) =>
|
||||
keyboard_log.Lines = keyboard_log.Lines.Take(8).ToArray();
|
||||
|
||||
private void Wnd_action_pos_Click(object sender, EventArgs e) =>
|
||||
tmpWnd.position = new Rectangle(wnd_action_pos_x_bar.Value, wnd_action_pos_y_bar.Value,
|
||||
tmpWnd.Position = new Rectangle(wnd_action_pos_x_bar.Value, wnd_action_pos_y_bar.Value,
|
||||
wnd_action_pos_w_bar.Value, wnd_action_pos_h_bar.Value);
|
||||
|
||||
private void Wnd_action_style_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
Enum.TryParse(wnd_action_style.SelectedValue.ToString(), out FormWindowState status);
|
||||
tmpWnd.state = status;
|
||||
tmpWnd.State = status;
|
||||
}
|
||||
|
||||
private void wnd_action_overlay_CheckedChanged(object sender, EventArgs e) =>
|
||||
tmpWnd.overlay = wnd_action_overlay.Checked;
|
||||
tmpWnd.Overlay = wnd_action_overlay.Checked;
|
||||
|
||||
private void readerUpdate_Tick(object sender, EventArgs e)
|
||||
{
|
||||
@ -239,37 +247,39 @@ namespace CC_Functions.W32.Test
|
||||
using IDCDrawer drawer = DeskMan.CreateGraphics();
|
||||
Graphics g = drawer.Graphics;
|
||||
Pen eye = new Pen(new SolidBrush(Color.Red), 2);
|
||||
g.DrawCurve(eye, new PointF[] { makePoint(20, 50), makePoint(50, 65), makePoint(80, 50) });
|
||||
g.DrawCurve(eye, new PointF[] { makePoint(20, 50), makePoint(50, 35), makePoint(80, 50) });
|
||||
g.DrawEllipse(eye, new RectangleF(PointF.Subtract(makePoint(50, 50), makeSizeY(15, 15)), makeSizeY(30, 30)));
|
||||
g.DrawCurve(eye, new[] {makePoint(20, 50), makePoint(50, 65), makePoint(80, 50)});
|
||||
g.DrawCurve(eye, new[] {makePoint(20, 50), makePoint(50, 35), makePoint(80, 50)});
|
||||
g.DrawEllipse(eye,
|
||||
new RectangleF(PointF.Subtract(makePoint(50, 50), makeSizeY(15, 15)), makeSizeY(30, 30)));
|
||||
}
|
||||
|
||||
public static PointF makePoint(float xPercent, float yPercent) => new PointF(Screen.PrimaryScreen.Bounds.Width * xPercent / 100,
|
||||
Screen.PrimaryScreen.Bounds.Height * yPercent / 100);
|
||||
public static PointF makePoint(float xPercent, float yPercent) => new PointF(
|
||||
(Screen.PrimaryScreen.Bounds.Width * xPercent) / 100,
|
||||
(Screen.PrimaryScreen.Bounds.Height * yPercent) / 100);
|
||||
|
||||
public static SizeF makeSizeY(float xPercent, float yPercent) => new SizeF(Screen.PrimaryScreen.Bounds.Height * xPercent / 100,
|
||||
Screen.PrimaryScreen.Bounds.Height * yPercent / 100);
|
||||
public static SizeF makeSizeY(float xPercent, float yPercent) => new SizeF(
|
||||
(Screen.PrimaryScreen.Bounds.Height * xPercent) / 100,
|
||||
(Screen.PrimaryScreen.Bounds.Height * yPercent) / 100);
|
||||
|
||||
private void desk_set_Click(object sender, EventArgs e)
|
||||
{
|
||||
OpenFileDialog dlg = new OpenFileDialog();
|
||||
dlg.Filter = "Images (*.jpg, *.jpeg, *.jpe, *.jfif, *.png)|*.jpg;*.jpeg;*.jpe;*.jfif;*.png";
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
DeskMan.Wallpaper = Image.FromFile(dlg.FileName);
|
||||
}
|
||||
if (dlg.ShowDialog() == DialogResult.OK) DeskMan.Wallpaper = Image.FromFile(dlg.FileName);
|
||||
}
|
||||
|
||||
private void screen_get_Click(object sender, EventArgs e) => screen_img.BackgroundImage = ScreenMan.CaptureScreen();
|
||||
private void screen_get_Click(object sender, EventArgs e) =>
|
||||
screen_img.BackgroundImage = ScreenMan.CaptureScreen();
|
||||
|
||||
private void screen_draw_Click(object sender, EventArgs e)
|
||||
{
|
||||
using IDCDrawer drawer = ScreenMan.GetDrawer(false);
|
||||
Graphics g = drawer.Graphics;
|
||||
Pen eye = new Pen(new SolidBrush(Color.Red), 2);
|
||||
g.DrawCurve(eye, new PointF[] { makePoint(20, 50), makePoint(50, 65), makePoint(80, 50) });
|
||||
g.DrawCurve(eye, new PointF[] { makePoint(20, 50), makePoint(50, 35), makePoint(80, 50) });
|
||||
g.DrawEllipse(eye, new RectangleF(PointF.Subtract(makePoint(50, 50), makeSizeY(15, 15)), makeSizeY(30, 30)));
|
||||
g.DrawCurve(eye, new[] {makePoint(20, 50), makePoint(50, 65), makePoint(80, 50)});
|
||||
g.DrawCurve(eye, new[] {makePoint(20, 50), makePoint(50, 35), makePoint(80, 50)});
|
||||
g.DrawEllipse(eye,
|
||||
new RectangleF(PointF.Subtract(makePoint(50, 50), makeSizeY(15, 15)), makeSizeY(30, 30)));
|
||||
}
|
||||
}
|
||||
}
|
@ -6,9 +6,13 @@ namespace CC_Functions.W32.DCDrawer
|
||||
{
|
||||
public class DCBuffered : IDCDrawer
|
||||
{
|
||||
private readonly DCUnbuffered drawer;
|
||||
private readonly BufferedGraphics buffer;
|
||||
public DCBuffered(IntPtr ptr) : this(ptr, IntPtr.Zero) {}
|
||||
private readonly DCUnbuffered drawer;
|
||||
|
||||
public DCBuffered(IntPtr ptr) : this(ptr, IntPtr.Zero)
|
||||
{
|
||||
}
|
||||
|
||||
public DCBuffered(IntPtr ptr, IntPtr hWnd)
|
||||
{
|
||||
drawer = new DCUnbuffered(ptr, hWnd);
|
||||
|
@ -6,8 +6,8 @@ namespace CC_Functions.W32.DCDrawer
|
||||
{
|
||||
public class DCUnbuffered : IDCDrawer
|
||||
{
|
||||
private readonly IntPtr hWnd;
|
||||
private readonly IntPtr ptr;
|
||||
private IntPtr hWnd;
|
||||
|
||||
public DCUnbuffered(IntPtr ptr, IntPtr hWnd)
|
||||
{
|
||||
|
@ -10,34 +10,13 @@ namespace CC_Functions.W32
|
||||
{
|
||||
public static class DeskMan
|
||||
{
|
||||
public static IDCDrawer CreateGraphics(bool buffered = false)
|
||||
{
|
||||
Wnd32 progman = Wnd32.fromMetadata("Progman");
|
||||
IntPtr result = IntPtr.Zero;
|
||||
user32.SendMessageTimeout(progman.hWnd, 0x052C, new IntPtr(0), IntPtr.Zero, 0x0, 1000, out result);
|
||||
IntPtr workerW = IntPtr.Zero;
|
||||
user32.EnumWindows((tophandle, topparamhandle) =>
|
||||
{
|
||||
IntPtr p = user32.FindWindowEx(tophandle, IntPtr.Zero, "SHELLDLL_DefView", IntPtr.Zero);
|
||||
if (p != IntPtr.Zero)
|
||||
{
|
||||
workerW = user32.FindWindowEx(IntPtr.Zero, tophandle, "WorkerW", IntPtr.Zero);
|
||||
}
|
||||
return true;
|
||||
}, IntPtr.Zero);
|
||||
IntPtr dc = user32.GetDCEx(workerW, IntPtr.Zero, 0x403);
|
||||
if (dc == IntPtr.Zero)
|
||||
{
|
||||
throw new Exception("Something went wrong when creatiing the Graphics object");
|
||||
}
|
||||
return buffered ? (IDCDrawer)new DCBuffered(dc) : new DCUnbuffered(dc);
|
||||
}
|
||||
|
||||
public static Image Wallpaper
|
||||
{
|
||||
get
|
||||
{
|
||||
using (var bmpTemp = new Bitmap(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\Microsoft\Windows\Themes\TranscodedWallpaper"))
|
||||
using (Bitmap bmpTemp =
|
||||
new Bitmap(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
|
||||
@"\Microsoft\Windows\Themes\TranscodedWallpaper"))
|
||||
{
|
||||
return (Image) bmpTemp.Clone();
|
||||
}
|
||||
@ -53,5 +32,22 @@ namespace CC_Functions.W32
|
||||
File.Delete(tempPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static IDCDrawer CreateGraphics(bool buffered = false)
|
||||
{
|
||||
Wnd32 progman = Wnd32.FromMetadata("Progman");
|
||||
IntPtr result = IntPtr.Zero;
|
||||
user32.SendMessageTimeout(progman.HWnd, 0x052C, new IntPtr(0), IntPtr.Zero, 0x0, 1000, out result);
|
||||
IntPtr workerW = IntPtr.Zero;
|
||||
user32.EnumWindows((tophandle, topparamhandle) =>
|
||||
{
|
||||
IntPtr p = user32.FindWindowEx(tophandle, IntPtr.Zero, "SHELLDLL_DefView", IntPtr.Zero);
|
||||
if (p != IntPtr.Zero) workerW = user32.FindWindowEx(IntPtr.Zero, tophandle, "WorkerW", IntPtr.Zero);
|
||||
return true;
|
||||
}, IntPtr.Zero);
|
||||
IntPtr dc = user32.GetDCEx(workerW, IntPtr.Zero, 0x403);
|
||||
if (dc == IntPtr.Zero) throw new Exception("Something went wrong when creatiing the Graphics object");
|
||||
return buffered ? (IDCDrawer) new DCBuffered(dc) : new DCUnbuffered(dc);
|
||||
}
|
||||
}
|
||||
}
|
@ -6,9 +6,9 @@ namespace CC_Functions.W32
|
||||
{
|
||||
public static class GenericExtensions
|
||||
{
|
||||
public static Wnd32 GetWindow(this IntPtr handle) => Wnd32.fromHandle(handle);
|
||||
public static Wnd32 GetMainWindow(this Process handle) => Wnd32.getProcessMain(handle);
|
||||
public static Wnd32 GetWnd32(this Form frm) => Wnd32.fromForm(frm);
|
||||
public static Wnd32 GetWindow(this IntPtr handle) => Wnd32.FromHandle(handle);
|
||||
public static Wnd32 GetMainWindow(this Process handle) => Wnd32.GetProcessMain(handle);
|
||||
public static Wnd32 GetWnd32(this Form frm) => Wnd32.FromForm(frm);
|
||||
public static bool IsDown(this Keys key) => KeyboardReader.IsKeyDown(key);
|
||||
|
||||
public static Privileges.SecurityEntity GetEntity(this Privileges.SecurityEntity2 entity) =>
|
||||
|
@ -6,6 +6,10 @@ namespace CC_Functions.W32.Native
|
||||
{
|
||||
internal static class user32
|
||||
{
|
||||
public delegate bool EnumDelegate(IntPtr hWnd, int lParam);
|
||||
|
||||
public delegate IntPtr LowLevelProc(int nCode, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern IntPtr GetWindowDC(IntPtr hWnd);
|
||||
|
||||
@ -116,12 +120,11 @@ namespace CC_Functions.W32.Native
|
||||
public static extern bool EnumWindows(EnumDelegate lpEnumFunc, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
|
||||
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className,
|
||||
IntPtr windowTitle);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
||||
public static extern IntPtr SendMessageTimeout(IntPtr windowHandle, uint Msg, IntPtr wParam, IntPtr lParam, uint flags, uint timeout, out IntPtr result);
|
||||
|
||||
public delegate IntPtr LowLevelProc(int nCode, IntPtr wParam, IntPtr lParam);
|
||||
public delegate bool EnumDelegate(IntPtr hWnd, int lParam);
|
||||
public static extern IntPtr SendMessageTimeout(IntPtr windowHandle, uint Msg, IntPtr wParam, IntPtr lParam,
|
||||
uint flags, uint timeout, out IntPtr result);
|
||||
}
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using CC_Functions.W32.Native;
|
||||
using static CC_Functions.W32.Privileges;
|
||||
|
||||
|
@ -88,6 +88,11 @@ namespace CC_Functions.W32
|
||||
SE_UNSOLICITED_INPUT_NAME_TEXT
|
||||
}
|
||||
|
||||
internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
|
||||
internal const int ERROR_NOT_ALL_ASSIGNED = 1300;
|
||||
internal const uint TOKEN_QUERY = 0x0008;
|
||||
internal const uint TOKEN_ADJUST_PRIVILEGES = 0x0020;
|
||||
|
||||
public static void EnablePrivilege(SecurityEntity securityEntity)
|
||||
{
|
||||
if (!Enum.IsDefined(typeof(SecurityEntity), securityEntity))
|
||||
@ -156,11 +161,6 @@ namespace CC_Functions.W32
|
||||
|
||||
public static SecurityEntity EntityToEntity(SecurityEntity2 entity) => (SecurityEntity) entity;
|
||||
|
||||
internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
|
||||
internal const int ERROR_NOT_ALL_ASSIGNED = 1300;
|
||||
internal const uint TOKEN_QUERY = 0x0008;
|
||||
internal const uint TOKEN_ADJUST_PRIVILEGES = 0x0020;
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct LUID
|
||||
{
|
||||
|
@ -8,6 +8,7 @@ namespace CC_Functions.W32
|
||||
{
|
||||
public static class ScreenMan
|
||||
{
|
||||
private const int SRCCOPY = 13369376;
|
||||
public static Image CaptureScreen() => CaptureWindow(user32.GetDesktopWindow());
|
||||
|
||||
public static Image CaptureWindow(IntPtr handle)
|
||||
@ -44,7 +45,5 @@ namespace CC_Functions.W32
|
||||
public static Rectangle GetBounds() => Screen.PrimaryScreen.Bounds;
|
||||
|
||||
public static void Refresh() => shell32.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
|
||||
|
||||
private const int SRCCOPY = 13369376;
|
||||
}
|
||||
}
|
272
W32/Wnd32.cs
272
W32/Wnd32.cs
@ -10,123 +10,199 @@ using CC_Functions.W32.Native;
|
||||
|
||||
namespace CC_Functions.W32
|
||||
{
|
||||
/// <summary>
|
||||
/// Object representing a window handle in the Windows API. Provides a simplified interface for basic interactions
|
||||
/// </summary>
|
||||
public sealed class Wnd32 : IEquatable<Wnd32>
|
||||
{
|
||||
#region Exposed
|
||||
|
||||
#region CreateInstance
|
||||
|
||||
private Wnd32(IntPtr wndref) => hWnd = wndref;
|
||||
private Wnd32(IntPtr handle) => HWnd = handle;
|
||||
|
||||
public static Wnd32 fromHandle(IntPtr handle) => new Wnd32(handle);
|
||||
/// <summary>
|
||||
/// Base method. Generates a window object from the specified handle
|
||||
/// </summary>
|
||||
/// <param name="handle">The handle</param>
|
||||
/// <returns>The window</returns>
|
||||
public static Wnd32 FromHandle(IntPtr handle) => new Wnd32(handle);
|
||||
|
||||
public static Wnd32 getProcessMain(Process process) => fromHandle(process.MainWindowHandle);
|
||||
/// <summary>
|
||||
/// Gets the main window of the process
|
||||
/// </summary>
|
||||
/// <param name="process">The process</param>
|
||||
/// <returns>The window. Might be IntPtr.Zero</returns>
|
||||
public static Wnd32 GetProcessMain(Process process) => FromHandle(process.MainWindowHandle);
|
||||
|
||||
public static Wnd32 fromMetadata(string? lpClassName = null, string? lpWindowName = null) =>
|
||||
fromHandle(user32.FindWindow(lpClassName, lpWindowName));
|
||||
/// <summary>
|
||||
/// Generates a window from metadata. Parameters should be null if they are not used
|
||||
/// </summary>
|
||||
/// <param name="lpClassName">
|
||||
/// The class name of the window. Use the name you found before using the ClassName-parameter of
|
||||
/// a window
|
||||
/// </param>
|
||||
/// <param name="lpWindowName">The windows name (title)</param>
|
||||
/// <returns>The window. Might be IntPtr.Zero</returns>
|
||||
public static Wnd32 FromMetadata(string? lpClassName = null, string? lpWindowName = null) =>
|
||||
FromHandle(user32.FindWindow(lpClassName, lpWindowName));
|
||||
|
||||
public static Wnd32 fromPoint(Point point) => fromHandle(user32.WindowFromPoint(point.X, point.Y));
|
||||
/// <summary>
|
||||
/// Gets the window that is visible at the specified point
|
||||
/// </summary>
|
||||
/// <param name="point">The point to scan</param>
|
||||
/// <returns>The window. Might be IntPtr.Zero</returns>
|
||||
public static Wnd32 FromPoint(Point point) => FromHandle(user32.WindowFromPoint(point.X, point.Y));
|
||||
|
||||
public static Wnd32 fromForm(Form form) => fromHandle(form.Handle);
|
||||
/// <summary>
|
||||
/// Gets the window associated with the forms handle
|
||||
/// </summary>
|
||||
/// <param name="form">Form to get window from</param>
|
||||
/// <returns>The window. Might be IntPtr.Zero</returns>
|
||||
public static Wnd32 FromForm(Form form) => FromHandle(form.Handle);
|
||||
|
||||
/// <summary>
|
||||
/// Gets ALL windows. In most cases you will want to use Wnd32.Visible
|
||||
/// </summary>
|
||||
/// <exception cref="Win32Exception"></exception>
|
||||
public static Wnd32[] All
|
||||
{
|
||||
get { WindowHandles = new List<IntPtr>();
|
||||
get
|
||||
{
|
||||
_windowHandles = new List<IntPtr>();
|
||||
if (!user32.EnumDesktopWindows(IntPtr.Zero, FilterCallback, IntPtr.Zero))
|
||||
throw new Win32Exception("There was a native error. This should never happen!");
|
||||
return WindowHandles.Select(s => fromHandle(s)).ToArray(); }
|
||||
return _windowHandles.Select(s => FromHandle(s)).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
public static Wnd32[] Visible => All.Where(s => user32.IsWindowVisible(s.hWnd) && !string.IsNullOrEmpty(s.title)).ToArray();
|
||||
public static Wnd32 Foreground => fromHandle(user32.GetForegroundWindow());
|
||||
public static Wnd32 ConsoleWindow => fromHandle(kernel32.GetConsoleWindow());
|
||||
/// <summary>
|
||||
/// Gets all visible windows with valid titles
|
||||
/// </summary>
|
||||
public static Wnd32[] Visible =>
|
||||
All.Where(s => user32.IsWindowVisible(s.HWnd) && !string.IsNullOrEmpty(s.Title)).ToArray();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the foreground window
|
||||
/// </summary>
|
||||
public static Wnd32 Foreground => FromHandle(user32.GetForegroundWindow());
|
||||
|
||||
/// <summary>
|
||||
/// The current programs console window. Do NOT use this if you are not targeting a console app or allocating a console
|
||||
/// </summary>
|
||||
public static Wnd32 ConsoleWindow => FromHandle(kernel32.GetConsoleWindow());
|
||||
|
||||
#endregion CreateInstance
|
||||
|
||||
#region InstanceActions
|
||||
|
||||
public string title
|
||||
/// <summary>
|
||||
/// The windows title
|
||||
/// </summary>
|
||||
public string Title
|
||||
{
|
||||
get
|
||||
{
|
||||
int length = user32.GetWindowTextLength(hWnd);
|
||||
int length = user32.GetWindowTextLength(HWnd);
|
||||
StringBuilder sb = new StringBuilder(length + 1);
|
||||
user32.GetWindowText(hWnd, sb, sb.Capacity);
|
||||
user32.GetWindowText(HWnd, sb, sb.Capacity);
|
||||
return sb.ToString();
|
||||
}
|
||||
set => user32.SetWindowText(hWnd, value);
|
||||
set => user32.SetWindowText(HWnd, value);
|
||||
}
|
||||
|
||||
public Rectangle position
|
||||
/// <summary>
|
||||
/// The windows position in screen-space
|
||||
/// </summary>
|
||||
public Rectangle Position
|
||||
{
|
||||
get
|
||||
{
|
||||
RECT Rect = new RECT();
|
||||
user32.GetWindowRect(hWnd, ref Rect);
|
||||
return new Rectangle(new Point(Rect.Left, Rect.Top),
|
||||
new Size(Rect.Width, Rect.Height));
|
||||
RECT rect = new RECT();
|
||||
user32.GetWindowRect(HWnd, ref rect);
|
||||
return new Rectangle(new Point(rect.Left, rect.Top),
|
||||
new Size(rect.Width, rect.Height));
|
||||
}
|
||||
set
|
||||
{
|
||||
RECT Rect = new RECT();
|
||||
user32.GetWindowRect(hWnd, ref Rect);
|
||||
user32.MoveWindow(hWnd, value.X, value.Y, value.Width, value.Height, true);
|
||||
RECT rect = new RECT();
|
||||
user32.GetWindowRect(HWnd, ref rect);
|
||||
user32.MoveWindow(HWnd, value.X, value.Y, value.Width, value.Height, true);
|
||||
}
|
||||
}
|
||||
|
||||
public bool isForeground
|
||||
/// <summary>
|
||||
/// Gets whether the window is the foreground window or brings it to the front. "False" must not be assigned!
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">Thrown when the value is "False"</exception>
|
||||
public bool IsForeground
|
||||
{
|
||||
get => user32.GetForegroundWindow() == hWnd;
|
||||
get => user32.GetForegroundWindow() == HWnd;
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
user32.SetForegroundWindow(hWnd);
|
||||
user32.SetForegroundWindow(HWnd);
|
||||
else
|
||||
throw new InvalidOperationException(
|
||||
"You can't set a Window not to be in the foreground. Move another one over it!");
|
||||
}
|
||||
}
|
||||
|
||||
public bool enabled
|
||||
/// <summary>
|
||||
/// Whether the window is enabled. Functionally similar to WinForms' "Control.Enabled"
|
||||
/// </summary>
|
||||
public bool Enabled
|
||||
{
|
||||
get => user32.IsWindowEnabled(hWnd);
|
||||
set => user32.EnableWindow(hWnd, value);
|
||||
get => user32.IsWindowEnabled(HWnd);
|
||||
set => user32.EnableWindow(HWnd, value);
|
||||
}
|
||||
|
||||
public Icon icon
|
||||
/// <summary>
|
||||
/// Gets the windows icon
|
||||
/// </summary>
|
||||
public Icon Icon
|
||||
{
|
||||
get
|
||||
{
|
||||
IntPtr hicon = user32.SendMessage(hWnd, 0x7F, 1, 0);
|
||||
if (hicon == IntPtr.Zero)
|
||||
hicon = user32.SendMessage(hWnd, 0x7F, 0, 0);
|
||||
if (hicon == IntPtr.Zero)
|
||||
hicon = user32.SendMessage(hWnd, 0x7F, 2, 0);
|
||||
return Icon.FromHandle(hicon);
|
||||
IntPtr hIcon = user32.SendMessage(HWnd, 0x7F, 1, 0);
|
||||
if (hIcon == IntPtr.Zero)
|
||||
hIcon = user32.SendMessage(HWnd, 0x7F, 0, 0);
|
||||
if (hIcon == IntPtr.Zero)
|
||||
hIcon = user32.SendMessage(HWnd, 0x7F, 2, 0);
|
||||
return Icon.FromHandle(hIcon);
|
||||
}
|
||||
}
|
||||
|
||||
public bool shown
|
||||
/// <summary>
|
||||
/// Whether the window is visible
|
||||
/// </summary>
|
||||
public bool Shown
|
||||
{
|
||||
get => user32.IsWindowVisible(hWnd);
|
||||
set => user32.ShowWindow(hWnd, value ? 9 : 0);
|
||||
get => user32.IsWindowVisible(HWnd);
|
||||
set => user32.ShowWindow(HWnd, value ? 9 : 0);
|
||||
}
|
||||
|
||||
public string className
|
||||
/// <summary>
|
||||
/// Gets the windows class name, This is basically only useful for finding window class-names of specified programs
|
||||
/// </summary>
|
||||
public string ClassName
|
||||
{
|
||||
get
|
||||
{
|
||||
StringBuilder ClassName = new StringBuilder(256);
|
||||
user32.GetClassName(hWnd, ClassName, ClassName.Capacity);
|
||||
return ClassName.ToString();
|
||||
StringBuilder className = new StringBuilder(256);
|
||||
user32.GetClassName(HWnd, className, className.Capacity);
|
||||
return className.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public FormWindowState state
|
||||
/// <summary>
|
||||
/// Sets the window state
|
||||
/// </summary>
|
||||
public FormWindowState State
|
||||
{
|
||||
get
|
||||
{
|
||||
int style = user32.GetWindowLong(hWnd, -16);
|
||||
int style = user32.GetWindowLong(HWnd, -16);
|
||||
if ((style & 0x01000000) == 0x01000000)
|
||||
return FormWindowState.Maximized;
|
||||
if ((style & 0x20000000) == 0x20000000)
|
||||
@ -138,50 +214,107 @@ namespace CC_Functions.W32
|
||||
switch (value)
|
||||
{
|
||||
case FormWindowState.Minimized:
|
||||
user32.ShowWindow(hWnd, 11);
|
||||
user32.ShowWindow(HWnd, 11);
|
||||
break;
|
||||
|
||||
case FormWindowState.Normal:
|
||||
user32.ShowWindow(hWnd, 1);
|
||||
user32.ShowWindow(HWnd, 1);
|
||||
break;
|
||||
|
||||
case FormWindowState.Maximized:
|
||||
user32.ShowWindow(hWnd, 3);
|
||||
user32.ShowWindow(HWnd, 3);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new ArgumentException("The provided WindowState was invalid", "value");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool overlay
|
||||
/// <summary>
|
||||
/// Overlays the window over others
|
||||
/// </summary>
|
||||
public bool Overlay
|
||||
{
|
||||
set
|
||||
{
|
||||
Rectangle tmp = position;
|
||||
user32.SetWindowPos(hWnd, value ? HWND_TOPMOST : HWND_NOTOPMOST, tmp.X, tmp.Y, tmp.Width, tmp.Height,
|
||||
value ? SWP_NOMOVE | SWP_NOSIZE : 0);
|
||||
Rectangle tmp = Position;
|
||||
user32.SetWindowPos(HWnd, value ? new IntPtr(-1) : new IntPtr(-2), tmp.X, tmp.Y, tmp.Width, tmp.Height,
|
||||
value ? (uint) 3 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Destroy()
|
||||
/// <summary>
|
||||
/// Forces the window to close
|
||||
/// </summary>
|
||||
/// <exception cref="Exception">Thrown if the window could not be closed</exception>
|
||||
public void Destroy()
|
||||
{
|
||||
if (user32.DestroyWindow(hWnd))
|
||||
return true;
|
||||
if (!user32.DestroyWindow(HWnd))
|
||||
throw new Exception("Failed.");
|
||||
}
|
||||
|
||||
public bool stillExists => user32.IsWindow(hWnd);
|
||||
/// <summary>
|
||||
/// Whether the IntPtr is a window and still exists
|
||||
/// </summary>
|
||||
public bool StillExists => user32.IsWindow(HWnd);
|
||||
|
||||
public override string ToString() => hWnd + "; " + title + "; " + position;
|
||||
/// <summary>
|
||||
/// Creates a user-readable string from the windows hWnd, title and position
|
||||
/// </summary>
|
||||
/// <returns>The created string</returns>
|
||||
public override string ToString() => $"{HWnd}; {Title}; {Position}";
|
||||
|
||||
/// <summary>
|
||||
/// Equality operator, uses the hWnd field
|
||||
/// </summary>
|
||||
/// <param name="obj">Object (Window) to compare</param>
|
||||
/// <returns>Equality result</returns>
|
||||
public override bool Equals(object obj) => Equals(obj as Wnd32);
|
||||
|
||||
public bool Equals(Wnd32 other) => other != null && EqualityComparer<IntPtr>.Default.Equals(hWnd, other.hWnd);
|
||||
/// <summary>
|
||||
/// Equality operator, uses the hWnd field
|
||||
/// </summary>
|
||||
/// <param name="other">Window to compare</param>
|
||||
/// <returns>Equality result</returns>
|
||||
public bool Equals(Wnd32 other) => !IsNull(other) && other != null && HWnd.Equals(other.HWnd);
|
||||
|
||||
public override int GetHashCode() => -75345830 + EqualityComparer<IntPtr>.Default.GetHashCode(hWnd);
|
||||
/// <summary>
|
||||
/// Equality operator, uses the hWnd field
|
||||
/// </summary>
|
||||
/// <returns>Equality result</returns>
|
||||
public override int GetHashCode() => HWnd.GetHashCode();
|
||||
|
||||
public static bool operator ==(Wnd32 left, Wnd32 right) => EqualityComparer<Wnd32>.Default.Equals(left, right);
|
||||
/// <summary>
|
||||
/// Equality operator, uses the hWnd field
|
||||
/// </summary>
|
||||
/// <param name="left">Window to compare</param>
|
||||
/// <param name="right">Window to compare</param>
|
||||
/// <returns>Equality result</returns>
|
||||
public static bool operator ==(Wnd32 left, Wnd32 right) => !AreNull(left, right) && left.HWnd == right.HWnd;
|
||||
|
||||
public static bool operator !=(Wnd32 left, Wnd32 right) => !(left == right);
|
||||
/// <summary>
|
||||
/// Equality operator, uses the hWnd field
|
||||
/// </summary>
|
||||
/// <param name="left">Window to compare</param>
|
||||
/// <param name="right">Window to compare</param>
|
||||
/// <returns>Equality result</returns>
|
||||
public static bool operator !=(Wnd32 left, Wnd32 right) => AreNull(left, right) || left.HWnd != right.HWnd;
|
||||
|
||||
private static bool AreNull(params Wnd32[] windows) => windows.Any(IsNull);
|
||||
|
||||
private static bool IsNull(Wnd32 window)
|
||||
{
|
||||
try
|
||||
{
|
||||
window.ToString();
|
||||
return false;
|
||||
}
|
||||
catch (NullReferenceException)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion InstanceActions
|
||||
|
||||
@ -189,20 +322,21 @@ namespace CC_Functions.W32
|
||||
|
||||
#region Internal
|
||||
|
||||
public IntPtr hWnd;
|
||||
/// <summary>
|
||||
/// The windows' handle
|
||||
/// </summary>
|
||||
public readonly IntPtr HWnd;
|
||||
|
||||
private static List<IntPtr> _windowHandles;
|
||||
|
||||
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
|
||||
private static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
|
||||
private const uint SWP_NOSIZE = 0x0001;
|
||||
private const uint SWP_NOMOVE = 0x0002;
|
||||
private static List<IntPtr> WindowHandles;
|
||||
private static bool FilterCallback(IntPtr hWnd, int lParam)
|
||||
{
|
||||
StringBuilder sbTitle = new StringBuilder(1024);
|
||||
user32.GetWindowText(hWnd, sbTitle, 1024);
|
||||
WindowHandles.Add(hWnd);
|
||||
_windowHandles.Add(hWnd);
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion Internal
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user