|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using DevComponents.DotNetBar;
|
|
|
|
|
using NLog;
|
|
|
|
|
using POS.Language.Language;
|
|
|
|
|
using POSV.Bean;
|
|
|
|
|
using POSV.Entity;
|
|
|
|
|
using POSV.MessageEvent;
|
|
|
|
|
using POSV.Utils;
|
|
|
|
|
|
|
|
|
|
namespace POSV
|
|
|
|
|
{
|
|
|
|
|
public partial class BaseForm : Form
|
|
|
|
|
{
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern bool SetForegroundWindow(IntPtr hWnd);
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern IntPtr GetForegroundWindow();
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);
|
|
|
|
|
|
|
|
|
|
private readonly Logger _logger = null;
|
|
|
|
|
|
|
|
|
|
public BaseForm()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
|
|
|
|
_logger = NLog.LogManager.GetLogger(GetType().FullName);
|
|
|
|
|
|
|
|
|
|
//减少闪烁
|
|
|
|
|
SetStyles();
|
|
|
|
|
|
|
|
|
|
this.BackColor = Constant.DefaultBackColor;
|
|
|
|
|
|
|
|
|
|
this.ImeMode = ImeMode.Disable;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 减少闪烁
|
|
|
|
|
private void SetStyles()
|
|
|
|
|
{
|
|
|
|
|
SetStyle(
|
|
|
|
|
ControlStyles.UserPaint |
|
|
|
|
|
ControlStyles.AllPaintingInWmPaint |
|
|
|
|
|
ControlStyles.OptimizedDoubleBuffer |
|
|
|
|
|
ControlStyles.ResizeRedraw |
|
|
|
|
|
ControlStyles.DoubleBuffer, true);
|
|
|
|
|
//强制分配样式重新应用到控件上
|
|
|
|
|
UpdateStyles();
|
|
|
|
|
base.AutoScaleMode = AutoScaleMode.None;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
protected override void OnLoad(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnLoad(e);
|
|
|
|
|
|
|
|
|
|
//网络连接通知事件
|
|
|
|
|
MsgEvent.Receive(Constant.NETWORK_EVENT_NOTIFY, NetworkEventNotify);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void NetworkEventNotify(object sender, MsgEventArgs args)
|
|
|
|
|
{
|
|
|
|
|
bool isConnected = Convert.ToBoolean(args.Data);
|
|
|
|
|
Global.Instance.Online = isConnected;
|
|
|
|
|
|
|
|
|
|
LOGGER.Debug("检测网络连接状态<{0}>", isConnected);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void OnInputGotFocus(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
//触摸屏模式下自动关闭虚拟键盘
|
|
|
|
|
IntPtr hwnd = WindowsAPI.FindWindow("IPTip_Main_Window", null);
|
|
|
|
|
if (hwnd != IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
WindowsAPI.SendMessage(hwnd, WindowsAPI.WM_SYSCOMMAND, WindowsAPI.SC_CLOSE, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected Logger LOGGER
|
|
|
|
|
{
|
|
|
|
|
get { return _logger; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected Font GetSystemFont(SystemFont fontSize)
|
|
|
|
|
{
|
|
|
|
|
Font result = Constant.DEFAULT_FONT;
|
|
|
|
|
|
|
|
|
|
switch (fontSize)
|
|
|
|
|
{
|
|
|
|
|
case SystemFont.默认:
|
|
|
|
|
{
|
|
|
|
|
result = Constant.DEFAULT_FONT;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SystemFont.正常:
|
|
|
|
|
{
|
|
|
|
|
result = Constant.NORMAL_FONT;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SystemFont.小字:
|
|
|
|
|
{
|
|
|
|
|
result = Constant.SMALL_FONT;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SystemFont.大字:
|
|
|
|
|
{
|
|
|
|
|
result = Constant.BIG_FONT;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void ShowToastNotify(Control ctl, string msg, int duration)
|
|
|
|
|
{
|
|
|
|
|
if (this.IsDisposed || !this.IsHandleCreated) return;
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
ToastNotification.DefaultToastPosition = eToastPosition.MiddleCenter;
|
|
|
|
|
ToastNotification.ToastFont = Constant.BIG_BIG_FONT;
|
|
|
|
|
|
|
|
|
|
ToastNotification.CustomGlowColor = Color.Transparent;
|
|
|
|
|
ToastNotification.ToastBackColor = Color.Black;
|
|
|
|
|
ToastNotification.DefaultTimeoutInterval = duration;
|
|
|
|
|
ToastNotification.Close(ctl);//关闭所有toast
|
|
|
|
|
ToastNotification.Show(ctl, msg);
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void ShowToastNotify(Control ctl, string msg)
|
|
|
|
|
{
|
|
|
|
|
ShowToastNotify(ctl, msg, 2000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void SetF(IntPtr handle)
|
|
|
|
|
{
|
|
|
|
|
if (handle == GetForegroundWindow())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IntPtr ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
|
|
|
|
|
IntPtr ThreadID2 = GetWindowThreadProcessId(handle, IntPtr.Zero);
|
|
|
|
|
|
|
|
|
|
if (ThreadID1 != ThreadID2)
|
|
|
|
|
{
|
|
|
|
|
AttachThreadInput(ThreadID1, ThreadID2, 1);
|
|
|
|
|
SetForegroundWindow(handle);
|
|
|
|
|
AttachThreadInput(ThreadID1, ThreadID2, 0);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SetForegroundWindow(handle);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected void ShowMessage(LabelX label, string message)
|
|
|
|
|
{
|
|
|
|
|
LOGGER.Debug(message);
|
|
|
|
|
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
label.Symbol = "\uf05a";
|
|
|
|
|
label.SymbolColor = Color.RoyalBlue;
|
|
|
|
|
label.ForeColor = SystemColors.ControlText;
|
|
|
|
|
|
|
|
|
|
label.Text = message;
|
|
|
|
|
label.Refresh();
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void ShowMessage(LabelX label, string message, bool error)
|
|
|
|
|
{
|
|
|
|
|
LOGGER.Debug(message);
|
|
|
|
|
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
label.Symbol = "\uf05a";
|
|
|
|
|
label.SymbolColor = Color.RoyalBlue;
|
|
|
|
|
label.ForeColor = SystemColors.ControlText;
|
|
|
|
|
if (error)
|
|
|
|
|
{
|
|
|
|
|
label.Symbol = "\uf05c";
|
|
|
|
|
label.SymbolColor = Color.Red;
|
|
|
|
|
label.ForeColor = Color.Red;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
label.Text = LangProxy.ToLang(message);
|
|
|
|
|
label.Refresh();
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<ScreenInformation> m_Screens = new List<ScreenInformation>(2);
|
|
|
|
|
|
|
|
|
|
protected ScreenInformation PrimaryScreen
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (m_Screens.Count == 0)
|
|
|
|
|
RefreshScreens();
|
|
|
|
|
foreach (ScreenInformation s in m_Screens)
|
|
|
|
|
{
|
|
|
|
|
if (s.Primary)
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
if (m_Screens.Count > 0)
|
|
|
|
|
return m_Screens[0];
|
|
|
|
|
return new ScreenInformation(new Rectangle(0, 0, 1024, 768), new Rectangle(0, 0, 1024, 768), true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void RefreshScreens()
|
|
|
|
|
{
|
|
|
|
|
m_Screens.Clear();
|
|
|
|
|
foreach (System.Windows.Forms.Screen s in System.Windows.Forms.Screen.AllScreens)
|
|
|
|
|
m_Screens.Add(new ScreenInformation(s.Bounds, s.WorkingArea, s.Primary));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected ScreenInformation ScreenFromControl(System.Windows.Forms.Control control)
|
|
|
|
|
{
|
|
|
|
|
Rectangle r;
|
|
|
|
|
if (control.Parent != null)
|
|
|
|
|
{
|
|
|
|
|
Point screenLocation = control.PointToScreen(Point.Empty);
|
|
|
|
|
r = new Rectangle(screenLocation, control.Size);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
r = new Rectangle(control.Location, control.Size);
|
|
|
|
|
if (m_Screens.Count == 0)
|
|
|
|
|
RefreshScreens();
|
|
|
|
|
|
|
|
|
|
foreach (ScreenInformation s in m_Screens)
|
|
|
|
|
{
|
|
|
|
|
if (s.Bounds.Contains(r))
|
|
|
|
|
{
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
System.Windows.Forms.Screen scr = System.Windows.Forms.Screen.FromControl(control);
|
|
|
|
|
if (scr != null)
|
|
|
|
|
return new ScreenInformation(scr.Bounds, scr.WorkingArea);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected ScreenInformation ScreenFromPoint(Point pScreen)
|
|
|
|
|
{
|
|
|
|
|
if (m_Screens.Count == 0)
|
|
|
|
|
RefreshScreens();
|
|
|
|
|
|
|
|
|
|
foreach (ScreenInformation s in m_Screens)
|
|
|
|
|
{
|
|
|
|
|
if (s.Bounds.Contains(pScreen))
|
|
|
|
|
{
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
System.Windows.Forms.Screen scr = System.Windows.Forms.Screen.FromPoint(pScreen);
|
|
|
|
|
if (scr != null && scr.Bounds.Contains(pScreen))
|
|
|
|
|
return new ScreenInformation(scr.Bounds, scr.WorkingArea);
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public event TransparentEventHandler AcceptButtonClick;
|
|
|
|
|
protected virtual void OnAcceptButtonClick(TransparentEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
AcceptButtonClick?.Invoke(this, e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public event TransparentEventHandler CancelButtonClick;
|
|
|
|
|
protected virtual void OnCancelButtonClick(TransparentEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
CancelButtonClick?.Invoke(this, e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public delegate void TransparentEventHandler(object sender, TransparentEventArgs e);
|
|
|
|
|
|
|
|
|
|
public enum TransparentAction
|
|
|
|
|
{
|
|
|
|
|
None = 0,
|
|
|
|
|
Cancel = 1,
|
|
|
|
|
Accept = 2,
|
|
|
|
|
Replace = 3
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class TransparentEventArgs : EventArgs
|
|
|
|
|
{
|
|
|
|
|
private readonly TransparentAction _action;
|
|
|
|
|
private readonly string _keyCode;
|
|
|
|
|
private readonly object _data;
|
|
|
|
|
|
|
|
|
|
public Tuple<decimal, decimal, List<string>, Worker> Authz;
|
|
|
|
|
public TransparentEventArgs(TransparentAction action, string keyCode, object data) : this(action, keyCode, data, null)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public TransparentEventArgs(TransparentAction action, string keyCode, object data, Tuple<decimal, decimal, List<string>, Worker> authz = null)
|
|
|
|
|
{
|
|
|
|
|
this._keyCode = keyCode;
|
|
|
|
|
this._data = data;
|
|
|
|
|
this._action = action;
|
|
|
|
|
|
|
|
|
|
this.Authz = authz;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TransparentAction Action
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this._action;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public object Data
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this._data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string KeyCode
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this._keyCode;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class ScreenInformation
|
|
|
|
|
{
|
|
|
|
|
public Rectangle Bounds = Rectangle.Empty;
|
|
|
|
|
public Rectangle WorkingArea = Rectangle.Empty;
|
|
|
|
|
public bool Primary = false;
|
|
|
|
|
public ScreenInformation(Rectangle bounds, Rectangle workingarea)
|
|
|
|
|
{
|
|
|
|
|
this.Bounds = bounds;
|
|
|
|
|
this.WorkingArea = workingarea;
|
|
|
|
|
}
|
|
|
|
|
public ScreenInformation(Rectangle bounds, Rectangle workingarea, bool primary)
|
|
|
|
|
{
|
|
|
|
|
this.Bounds = bounds;
|
|
|
|
|
this.WorkingArea = workingarea;
|
|
|
|
|
this.Primary = primary;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class ShowInTaskBar
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
[DllImport("User32.dll")]
|
|
|
|
|
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
|
|
|
|
|
[DllImport("User32.dll")]
|
|
|
|
|
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
|
|
|
|
|
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
|
|
|
|
|
|
|
|
|
|
private const int SW_HIDE = 0x00;
|
|
|
|
|
private const int SW_SHOW = 0x05;
|
|
|
|
|
|
|
|
|
|
private const int WS_EX_APPWINDOW = 0x40000;
|
|
|
|
|
private const int GWL_EXSTYLE = -0x14;
|
|
|
|
|
|
|
|
|
|
public static void ShowWindowInTaskbar(IntPtr pMainWindow)
|
|
|
|
|
{
|
|
|
|
|
SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow, GWL_EXSTYLE) | WS_EX_APPWINDOW);
|
|
|
|
|
|
|
|
|
|
ShowWindow(pMainWindow, SW_HIDE);
|
|
|
|
|
ShowWindow(pMainWindow, SW_SHOW);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void HideWindowFromTaskbar(IntPtr pMainWindow)
|
|
|
|
|
{
|
|
|
|
|
SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow, GWL_EXSTYLE) | ~WS_EX_APPWINDOW);
|
|
|
|
|
|
|
|
|
|
ShowWindow(pMainWindow, SW_HIDE);
|
|
|
|
|
ShowWindow(pMainWindow, SW_SHOW);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|