You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

275 lines
10 KiB

using Container.Common;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace Container.ChildWindows
{
/// <summary>
/// WindowButton.xaml 的交互逻辑
/// </summary>
public partial class WindowButton : Window
{
Class_Log log = new Class_Log();//日志对象
App app = ((App)System.Windows.Application.Current);
Point _TicstartPoint;//鼠标按下位置
Point _TicendPoint;//鼠标抬起位置
//Point mousePostion;
//初始化
public WindowButton()
{
InitializeComponent();
this.Top = app.ScreenHeight - this.Height - 50;
this.Left = app.ScreenWidth - this.Width-65;
mLastInputInfo = new LASTINPUTINFO();
mLastInputInfo.cbSize = Marshal.SizeOf(mLastInputInfo);
mIdleTimer = new System.Windows.Threading.DispatcherTimer();
mIdleTimer.Tick += new EventHandler(IdleTime);//起个Timer一直获取当前时间
mIdleTimer.Interval = new TimeSpan(0, 0, 0, 1, 0);
;
//mIdleTimer.Start();
}
//窗体关闭事件
private void Windows_Closed(object sender, EventArgs e)
{
try
{
Process[] process = Process.GetProcesses();
foreach (Process prc in process)
{
if (prc.ProcessName.Equals(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
{
if (app.AppList != null && app.AppList.Count > 1)
{
WindowButton win = new WindowButton();
win.Show();
}
}
}
}
catch (Exception ex)
{
log.WriteLogFile("窗体关闭异常:" + ex.ToString(), "MainWindowError");
}
}
//鼠标按下事件
private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_TicstartPoint = new Point(this.Left, this.Top);
if (e.LeftButton == MouseButtonState.Pressed)
{
this.DragMove();
//SendMessage(new WindowInteropHelper(this).Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
}
//鼠标抬起事件
private void Btn_MouseUp(object sender, MouseButtonEventArgs e)
{
try
{
_TicendPoint = new Point(this.Left, this.Top);
//X轴滑动的距离
double offsetY = _TicstartPoint.Y - _TicendPoint.Y;
double offsetX = _TicstartPoint.X - _TicendPoint.X;
if (offsetY < 2 && offsetY > -2 && offsetX > -5 && offsetX < 5)
{
this.Img.Visibility = System.Windows.Visibility.Hidden;
//this.GgifImage.Visibility = System.Windows.Visibility.Hidden;
this.Img.Visibility = System.Windows.Visibility.Hidden;
//this.GgifImage.Visibility = System.Windows.Visibility.Hidden;
WindowAppChoose win = new WindowAppChoose(this.Top, this.Left + this.Width, this.Width);
win.ShowDialog();
//Thread.Sleep(1000);
//this.GgifImage.Visibility = System.Windows.Visibility.Visible;
this.Img.Visibility = System.Windows.Visibility.Visible;
//this.Left = SystemParameters.PrimaryScreenWidth - this.Width / 2 + 5;
}
}
catch (Exception ex)
{
log.WriteLogFile(ex.ToString());
}
}
//[DllImport("user32.dll")]
//public static extern bool ReleaseCapture();
//[DllImport("user32.dll")]
//public static extern bool SetCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
[DllImport("user32.dll", SetLastError = true)]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpWindowClass, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
const int GWL_HWNDPARENT = -8;
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
[DllImport("user32.dll", EntryPoint = "ShowWindow")]
public static extern bool ShowWindow(System.IntPtr hWnd, int nCmdShow);
public static int SW_SHOW = 5;
public static int SW_NORMAL = 1;
public static int SW_MAX = 3;
public static int SW_HIDE = 0;
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); //窗体置顶
public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2); //取消窗体置顶
public const uint SWP_NOMOVE = 0x0002; //不调整窗体位置
public const uint SWP_NOSIZE = 0x0001; //不调整窗体大小
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{//拖动窗体
SendMessage(new WindowInteropHelper(this).Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
#region 检测鼠标动作
//定义结构体
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
// 设置结构体块容量
[MarshalAs(UnmanagedType.U4)]
public int cbSize;
// 捕获的时间
[MarshalAs(UnmanagedType.U4)]
public uint dwTime;
}
// 定义定时器,结构体对象等
private DispatcherTimer mIdleTimer;
private LASTINPUTINFO mLastInputInfo;
[DllImport("user32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
/*初始化
mLastInputInfo = new LASTINPUTINFO();
mLastInputInfo.cbSize = Marshal.SizeOf(mLastInputInfo);
mIdleTimer = new System.Windows.Threading.DispatcherTimer();
mIdleTimer.Tick += new EventHandler(IdleTime);//起个Timer一直获取当前时间
mIdleTimer.Interval = new TimeSpan(0, 0, 0, 1, 0);
mIdleTimer.Start();
*/
//实现
private void IdleTime(object sender, EventArgs e)
{
if (!GetLastInputInfo(ref mLastInputInfo))
{
//MessageBox.Show("GetLastInputInfo Failed!");
//this.Top = SystemParameters.PrimaryScreenHeight - this.Height - 50;
//this.Left = SystemParameters.PrimaryScreenWidth - this.Width - 10;
}
else
{
if ((Environment.TickCount - (long)mLastInputInfo.dwTime) / 1000 > 10)
{
//MessageBox.Show("no operation for 5 minutes.");
//this.Top = SystemParameters.PrimaryScreenHeight - this.Height - 50;
this.Left = app.ScreenWidth - this.Width / 2 + 5;
}
}
}
#endregion
private void Win_MouseEnter(object sender, MouseEventArgs e)
{
//if (this.Left > SystemParameters.PrimaryScreenWidth - this.Width)
//{
// this.Left = SystemParameters.PrimaryScreenWidth - this.Width;
//}
}
private void Win_MouseLeave(object sender, MouseEventArgs e)
{
//if (this.Left >= SystemParameters.PrimaryScreenWidth - this.Width-2)
//{
// this.Left = SystemParameters.PrimaryScreenWidth - this.Width / 2 + 5;
//}
}
private void Btn_MouseDown(object sender, MouseButtonEventArgs e)
{
_TicstartPoint = e.GetPosition(App.Current.MainWindow);
}
private void GgifImage_MouseDown(object sender, MouseButtonEventArgs e)
{
//_TicstartPoint = PointToScreen(e.GetPosition(this));
_TicstartPoint = new Point(this.Left,this.Top);
}
private void GgifImage_MouseUp(object sender, MouseButtonEventArgs e)
{
try
{
_TicendPoint = new Point(this.Left, this.Top);
//X轴滑动的距离
double offsetY = _TicstartPoint.Y - _TicendPoint.Y;
double offsetX = _TicstartPoint.X - _TicendPoint.X;
if (offsetY < 2 && offsetY > -2 && offsetX > -5 && offsetX < 5)
{
this.Img.Visibility = System.Windows.Visibility.Hidden;
//this.GgifImage.Visibility = System.Windows.Visibility.Hidden;
this.Img.Visibility = System.Windows.Visibility.Hidden;
//this.GgifImage.Visibility = System.Windows.Visibility.Hidden;
WindowAppChoose win = new WindowAppChoose(this.Top, this.Left + this.Width, this.Width);
win.ShowDialog();
//Thread.Sleep(1000);
//this.GgifImage.Visibility = System.Windows.Visibility.Visible;
this.Img.Visibility = System.Windows.Visibility.Visible;
//this.Left = SystemParameters.PrimaryScreenWidth - this.Width / 2 + 5;
}
}
catch (Exception ex)
{
log.WriteLogFile(ex.ToString());
}
}
}
}