mirror of
https://github.com/kangyu-california/PersistentWindows.git
synced 2025-05-11 04:55:39 +02:00
300 lines
9 KiB
C#
300 lines
9 KiB
C#
using System;
|
|
using System.Timers;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
using PersistentWindows.Common.WinApiBridge;
|
|
|
|
namespace PersistentWindows.Common
|
|
{
|
|
public partial class HotKeyWindow : Form
|
|
{
|
|
private System.Timers.Timer aliveTimer;
|
|
private System.Timers.Timer clickDelayTimer;
|
|
private System.Timers.Timer mouseScrollDelayTimer;
|
|
private bool stay = false;
|
|
|
|
public HotKeyWindow()
|
|
{
|
|
InitializeComponent();
|
|
|
|
KeyDown += new KeyEventHandler(FormKeyDown);
|
|
MouseDown += new MouseEventHandler(FormMouseDown);
|
|
MouseWheel += new MouseEventHandler(FormMouseWheel);
|
|
Move += new EventHandler(FormMove);
|
|
FormClosing += new FormClosingEventHandler(FormClose);
|
|
|
|
aliveTimer = new System.Timers.Timer(2000);
|
|
aliveTimer.Elapsed += AliveTimerCallBack;
|
|
aliveTimer.SynchronizingObject = this;
|
|
aliveTimer.AutoReset = false;
|
|
aliveTimer.Enabled = false;
|
|
|
|
clickDelayTimer = new System.Timers.Timer(1000);
|
|
clickDelayTimer.Elapsed += ClickTimerCallBack;
|
|
clickDelayTimer.SynchronizingObject = this;
|
|
clickDelayTimer.AutoReset = false;
|
|
clickDelayTimer.Enabled = false;
|
|
|
|
mouseScrollDelayTimer = new System.Timers.Timer(250);
|
|
mouseScrollDelayTimer.Elapsed += MouseScrollCallBack;
|
|
mouseScrollDelayTimer.AutoReset = false;
|
|
mouseScrollDelayTimer.Enabled = false;
|
|
|
|
}
|
|
|
|
private void FormMove(object sender, EventArgs e)
|
|
{
|
|
if (!Visible)
|
|
return;
|
|
|
|
stay = true;
|
|
}
|
|
|
|
private void FormClose(object sender, FormClosingEventArgs e)
|
|
{
|
|
if (InvokeRequired)
|
|
BeginInvoke((Action) delegate ()
|
|
{
|
|
FormClose(sender, e);
|
|
});
|
|
else
|
|
{
|
|
e.Cancel = true;
|
|
if (User32.IsWindow(Handle))
|
|
User32.ShowWindow(Handle, (int)ShowWindowCommands.Hide);
|
|
}
|
|
}
|
|
|
|
private void FormMouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
StartAliveTimer();
|
|
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
|
|
if (e.Button == MouseButtons.Left)
|
|
{
|
|
//page down
|
|
SendKeys.Send("{PGDN}");
|
|
}
|
|
else if (e.Button == MouseButtons.Right)
|
|
{
|
|
//page up
|
|
SendKeys.Send("{PGUP}");
|
|
}
|
|
else if (e.Button == MouseButtons.Middle)
|
|
{
|
|
int i = 0;
|
|
}
|
|
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void FormMouseWheel(object sender, MouseEventArgs e)
|
|
{
|
|
StartAliveTimer();
|
|
|
|
User32.ShowWindow(Handle, (int)ShowWindowCommands.Hide);
|
|
int delta = e.Delta;
|
|
User32.mouse_event(MouseAction.MOUSEEVENTF_WHEEL, 0, 0, delta, UIntPtr.Zero);
|
|
//Show();
|
|
|
|
StartMouseScrollTimer();
|
|
}
|
|
|
|
void FormKeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
StartAliveTimer();
|
|
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
|
|
if (e.KeyCode == Keys.Q)
|
|
{
|
|
//kill tab, ctrl + w
|
|
SendKeys.Send("^w");
|
|
}
|
|
else if (e.KeyCode == Keys.W)
|
|
{
|
|
//new tab, ctrl + t
|
|
if (e.Shift)
|
|
SendKeys.Send("^T"); //open last closed tab
|
|
else
|
|
SendKeys.Send("^t"); //new tab
|
|
}
|
|
else if (e.KeyCode == Keys.A)
|
|
{
|
|
//prev url
|
|
SendKeys.Send("%{LEFT}");
|
|
}
|
|
else if (e.KeyCode == Keys.S)
|
|
{
|
|
//next url
|
|
SendKeys.Send("%{RIGHT}");
|
|
}
|
|
else if (e.KeyCode == Keys.Tab)
|
|
{
|
|
//toggle stay
|
|
stay = !stay;
|
|
if (!stay)
|
|
User32.ShowWindow(Handle, (int)ShowWindowCommands.Hide);
|
|
}
|
|
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
public void HotKeyPressed()
|
|
{
|
|
if (InvokeRequired)
|
|
BeginInvoke((Action) delegate ()
|
|
{
|
|
HotKeyPressed();
|
|
});
|
|
else
|
|
{
|
|
if (!User32.IsWindowVisible(Handle))
|
|
{
|
|
POINT cursor;
|
|
User32.GetCursorPos(out cursor);
|
|
Left = cursor.X - Size.Width / 2;
|
|
Top = cursor.Y - Size.Height / 2;
|
|
Show();
|
|
User32.SetForegroundWindow(Handle);
|
|
StartAliveTimer();
|
|
}
|
|
else
|
|
User32.ShowWindow(Handle, (int)ShowWindowCommands.Hide);
|
|
}
|
|
|
|
}
|
|
|
|
public void StartAliveTimer(int milliseconds = 2000)
|
|
{
|
|
aliveTimer.Interval = milliseconds;
|
|
aliveTimer.AutoReset = false;
|
|
aliveTimer.Enabled = true;
|
|
}
|
|
|
|
public void StartClickDelayTimer(int milliseconds)
|
|
{
|
|
clickDelayTimer.Interval = milliseconds;
|
|
clickDelayTimer.AutoReset = false;
|
|
clickDelayTimer.Enabled = true;
|
|
}
|
|
|
|
public void StartMouseScrollTimer(int milliseconds = 250)
|
|
{
|
|
mouseScrollDelayTimer.Interval = milliseconds;
|
|
mouseScrollDelayTimer.AutoReset = false;
|
|
mouseScrollDelayTimer.Enabled = true;
|
|
}
|
|
|
|
private void MouseScrollCallBack(Object source, ElapsedEventArgs e)
|
|
{
|
|
if (InvokeRequired)
|
|
BeginInvoke((Action)delegate ()
|
|
{
|
|
MouseScrollCallBack(source, e);
|
|
});
|
|
else
|
|
{
|
|
Show();
|
|
}
|
|
}
|
|
|
|
private void ClickTimerCallBack(Object source, ElapsedEventArgs e)
|
|
{
|
|
}
|
|
private void AliveTimerCallBack(Object source, ElapsedEventArgs e)
|
|
{
|
|
if (stay)
|
|
return;
|
|
|
|
{
|
|
if (User32.IsWindowVisible(Handle))
|
|
User32.ShowWindow(Handle, (int)ShowWindowCommands.Hide);
|
|
}
|
|
}
|
|
|
|
private void buttonPrevTab_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
SendKeys.Send("^+{TAB}");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void buttonNextTab_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
SendKeys.Send("^{TAB}");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void buttonPrevUrl_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
SendKeys.Send("%{LEFT}");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void buttonNextUrl_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
SendKeys.Send("%{RIGHT}");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void buttonCloseTab_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
SendKeys.Send("^w");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void buttonNewTab_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
bool shift_key_pressed = (User32.GetKeyState(0x10) & 0x8000) != 0;
|
|
if (shift_key_pressed)
|
|
SendKeys.Send("^T");
|
|
else
|
|
SendKeys.Send("^t");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void buttonHome_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
SendKeys.Send("{HOME}");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private void buttonEnd_Click(object sender, EventArgs e)
|
|
{
|
|
IntPtr fgwnd = GetForegroundWindow();
|
|
User32.SetForegroundWindow(fgwnd);
|
|
SendKeys.Send("{END}");
|
|
User32.SetForegroundWindow(Handle);
|
|
}
|
|
|
|
private static IntPtr GetForegroundWindow()
|
|
{
|
|
return PersistentWindowProcessor.GetForegroundWindow();
|
|
}
|
|
|
|
}
|
|
}
|