1.2版本,修复未联网闪退、win7无法点击设置问题,增加程序多开限制功能
This commit is contained in:
parent
c6437d822e
commit
34e797625b
|
@ -31,6 +31,7 @@
|
|||
this.labelProductName = new System.Windows.Forms.Label();
|
||||
this.labelVersion = new System.Windows.Forms.Label();
|
||||
this.labelCopyright = new System.Windows.Forms.Label();
|
||||
this.labelEmail = new System.Windows.Forms.Label();
|
||||
this.okButton = new System.Windows.Forms.Button();
|
||||
this.tableLayoutPanel.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
|
@ -42,16 +43,18 @@
|
|||
this.tableLayoutPanel.Controls.Add(this.labelProductName, 0, 0);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelVersion, 0, 1);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelCopyright, 0, 2);
|
||||
this.tableLayoutPanel.Controls.Add(this.okButton, 0, 3);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelEmail, 0, 3);
|
||||
this.tableLayoutPanel.Controls.Add(this.okButton, 0, 4);
|
||||
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8);
|
||||
this.tableLayoutPanel.Name = "tableLayoutPanel";
|
||||
this.tableLayoutPanel.RowCount = 4;
|
||||
this.tableLayoutPanel.RowCount = 5;
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tableLayoutPanel.Size = new System.Drawing.Size(223, 100);
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));
|
||||
this.tableLayoutPanel.Size = new System.Drawing.Size(223, 113);
|
||||
this.tableLayoutPanel.TabIndex = 0;
|
||||
//
|
||||
// labelProductName
|
||||
|
@ -69,7 +72,7 @@
|
|||
// labelVersion
|
||||
//
|
||||
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelVersion.Location = new System.Drawing.Point(6, 25);
|
||||
this.labelVersion.Location = new System.Drawing.Point(6, 21);
|
||||
this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 16);
|
||||
this.labelVersion.Name = "labelVersion";
|
||||
|
@ -81,7 +84,7 @@
|
|||
// labelCopyright
|
||||
//
|
||||
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelCopyright.Location = new System.Drawing.Point(6, 50);
|
||||
this.labelCopyright.Location = new System.Drawing.Point(6, 42);
|
||||
this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 16);
|
||||
this.labelCopyright.Name = "labelCopyright";
|
||||
|
@ -90,11 +93,23 @@
|
|||
this.labelCopyright.Text = "版权";
|
||||
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// labelEmail
|
||||
//
|
||||
this.labelEmail.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelEmail.Location = new System.Drawing.Point(6, 63);
|
||||
this.labelEmail.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelEmail.MaximumSize = new System.Drawing.Size(0, 16);
|
||||
this.labelEmail.Name = "labelEmail";
|
||||
this.labelEmail.Size = new System.Drawing.Size(214, 16);
|
||||
this.labelEmail.TabIndex = 25;
|
||||
this.labelEmail.Text = "Email";
|
||||
this.labelEmail.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// okButton
|
||||
//
|
||||
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.okButton.Location = new System.Drawing.Point(145, 78);
|
||||
this.okButton.Location = new System.Drawing.Point(145, 91);
|
||||
this.okButton.Name = "okButton";
|
||||
this.okButton.Size = new System.Drawing.Size(75, 19);
|
||||
this.okButton.TabIndex = 24;
|
||||
|
@ -106,7 +121,7 @@
|
|||
this.AcceptButton = this.okButton;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(241, 116);
|
||||
this.ClientSize = new System.Drawing.Size(241, 129);
|
||||
this.Controls.Add(this.tableLayoutPanel);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
|
@ -129,5 +144,6 @@
|
|||
private System.Windows.Forms.Label labelVersion;
|
||||
private System.Windows.Forms.Label labelCopyright;
|
||||
private System.Windows.Forms.Button okButton;
|
||||
private System.Windows.Forms.Label labelEmail;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ namespace Ultron.Ngrok
|
|||
this.labelProductName.Text = AssemblyProduct;
|
||||
this.labelVersion.Text = String.Format("版本 {0}", AssemblyVersion);
|
||||
this.labelCopyright.Text = AssemblyCopyright;
|
||||
this.labelEmail.Text = "邮箱 wixy@qq.com";
|
||||
}
|
||||
|
||||
#region 程序集特性访问器
|
||||
|
@ -104,6 +105,5 @@ namespace Ultron.Ngrok
|
|||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -183,12 +183,19 @@ namespace Ultron.Ngrok
|
|||
}
|
||||
|
||||
public void ReLoadConfig()
|
||||
{
|
||||
try
|
||||
{
|
||||
string configText = File.ReadAllText(ConfigFile, Encoding.UTF8);
|
||||
var input = new StringReader(configText);
|
||||
var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention());
|
||||
//var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention());
|
||||
var deserializer = new Deserializer();
|
||||
ServerConfig = deserializer.Deserialize<Config>(input);
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.InnerException.Message);
|
||||
}
|
||||
LoadConfig();
|
||||
}
|
||||
|
||||
|
|
|
@ -115,7 +115,7 @@
|
|||
//
|
||||
this.notifyIcon.ContextMenuStrip = this.notifyMenuStrip;
|
||||
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
|
||||
this.notifyIcon.Text = "uNgrok";
|
||||
this.notifyIcon.Text = Program.FormName;
|
||||
this.notifyIcon.Visible = true;
|
||||
this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_MouseDoubleClick);
|
||||
//
|
||||
|
@ -156,10 +156,9 @@
|
|||
this.MaximizeBox = false;
|
||||
this.Name = "FormMain";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "uNgrok";
|
||||
this.Text = Program.FormName;
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormMain_FormClosing);
|
||||
this.Load += new System.EventHandler(this.FormMain_Load);
|
||||
this.SizeChanged += new System.EventHandler(this.FormMain_SizeChanged);
|
||||
this.topMenuStrip.ResumeLayout(false);
|
||||
this.topMenuStrip.PerformLayout();
|
||||
this.notifyMenuStrip.ResumeLayout(false);
|
||||
|
|
|
@ -145,24 +145,18 @@ namespace Ultron.Ngrok
|
|||
|
||||
private void NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (WindowState == FormWindowState.Minimized)
|
||||
{
|
||||
//还原窗体显示
|
||||
WindowState = FormWindowState.Normal;
|
||||
//激活窗体并给予它焦点
|
||||
this.Activate();
|
||||
//任务栏区显示图标
|
||||
this.ShowInTaskbar = true;
|
||||
//托盘区图标隐藏
|
||||
notifyIcon.Visible = false;
|
||||
}
|
||||
if (this.WindowState == FormWindowState.Minimized)
|
||||
this.WindowState = FormWindowState.Normal;
|
||||
if (this.Visible == false)
|
||||
this.Show();
|
||||
}
|
||||
|
||||
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
if (setting.ServerConfig.UseNotifyMenu)
|
||||
{
|
||||
WindowState = FormWindowState.Minimized;
|
||||
notifyIcon.Visible = true;
|
||||
this.Hide();
|
||||
e.Cancel = true;
|
||||
}
|
||||
else
|
||||
|
@ -180,18 +174,6 @@ namespace Ultron.Ngrok
|
|||
}
|
||||
}
|
||||
|
||||
private void FormMain_SizeChanged(object sender, EventArgs e)
|
||||
{
|
||||
//判断是否选择的是最小化按钮
|
||||
if (WindowState == FormWindowState.Minimized)
|
||||
{
|
||||
//隐藏任务栏区图标
|
||||
this.ShowInTaskbar = false;
|
||||
//图标显示在托盘区
|
||||
notifyIcon.Visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (MessageBox.Show("是否确认退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
|
||||
|
@ -326,6 +308,8 @@ namespace Ultron.Ngrok
|
|||
}
|
||||
|
||||
public void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
StreamReader read = new StreamReader(e.Result);
|
||||
string str = read.ReadToEnd();
|
||||
|
@ -352,6 +336,12 @@ namespace Ultron.Ngrok
|
|||
}
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
MessageBox.Show($"无法检测更新:{ex.InnerException.Message}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void RunUpdateProgram(string verion)
|
||||
{
|
||||
|
|
|
@ -1,13 +1,76 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Ultron.Ngrok
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
#region WindowsAPI
|
||||
|
||||
/// <summary>
|
||||
/// 显示窗口
|
||||
/// </summary>
|
||||
/// <param name="hWnd"></param>
|
||||
/// <param name="cmdShow"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("User32.dll")]
|
||||
private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
|
||||
|
||||
/// <summary>
|
||||
/// 根据窗体句柄获得窗体标题
|
||||
/// </summary>
|
||||
/// <param name="hWnd"></param>
|
||||
/// <param name="lpText"></param>
|
||||
/// <param name="nCount"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpText, int nCount);
|
||||
|
||||
/// <summary>
|
||||
/// 根据窗体句柄获得其进程ID
|
||||
/// </summary>
|
||||
/// <param name="hwnd"></param>
|
||||
/// <param name="ID"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("User32.dll", CharSet = CharSet.Auto)]
|
||||
private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
|
||||
|
||||
/// <summary>
|
||||
/// 枚举窗体
|
||||
/// </summary>
|
||||
/// <param name="x"></param>
|
||||
/// <param name="y"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("user32")]
|
||||
private static extern int EnumWindows(CallBack x, int y);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 属性字段委托
|
||||
|
||||
/// <summary>
|
||||
/// 窗体标题
|
||||
/// </summary>
|
||||
public static string FormName = "uNgrok";
|
||||
|
||||
/// <summary>
|
||||
/// 显示窗口参数
|
||||
/// </summary>
|
||||
private const int SW_RESTORE = 9;
|
||||
|
||||
/// <summary>
|
||||
/// 已存在的进程实例
|
||||
/// </summary>
|
||||
private static Process instance = null;
|
||||
|
||||
private delegate bool CallBack(IntPtr hwnd, int lParam);
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 应用程序的主入口点。
|
||||
/// </summary>
|
||||
|
@ -16,7 +79,85 @@ namespace Ultron.Ngrok
|
|||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
//获取运行的进程
|
||||
instance = RunningInstance();
|
||||
if (instance == null)
|
||||
{
|
||||
//没有进程在运行
|
||||
Application.Run(new FormMain());
|
||||
}
|
||||
else
|
||||
{
|
||||
//是否托盘化, 托盘状态窗口句柄为0
|
||||
if (instance.MainWindowHandle.ToInt32() != 0)
|
||||
{
|
||||
//调用api函数,正常显示窗口
|
||||
ShowWindowAsync(instance.MainWindowHandle, SW_RESTORE);
|
||||
}
|
||||
else
|
||||
{
|
||||
CallBack callback = new CallBack(Report);
|
||||
EnumWindows(callback, 0);
|
||||
}
|
||||
|
||||
Environment.Exit(Environment.ExitCode);
|
||||
}
|
||||
}
|
||||
|
||||
#region 方法
|
||||
|
||||
/// <summary>
|
||||
/// 获取运行中的进程
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private static Process RunningInstance()
|
||||
{
|
||||
Process current = Process.GetCurrentProcess();
|
||||
Process[] processes = Process.GetProcessesByName(current.ProcessName);
|
||||
//遍历与当前进程名称相同的进程列表
|
||||
foreach (Process process in processes)
|
||||
{
|
||||
//如果实例已经存在则忽略当前进程
|
||||
if (process.Id != current.Id)
|
||||
{
|
||||
//保证要打开的进程同已经存在的进程来自同一文件路径
|
||||
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
|
||||
{
|
||||
//返回已经存在的进程
|
||||
return process;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 枚举窗口回调
|
||||
/// </summary>
|
||||
/// <param name="hwnd"></param>
|
||||
/// <param name="lParam"></param>
|
||||
/// <returns></returns>
|
||||
private static bool Report(IntPtr hwnd, int lParam)
|
||||
{
|
||||
//获得窗体标题
|
||||
StringBuilder sb = new StringBuilder(100);
|
||||
GetWindowText(hwnd, sb, sb.Capacity);
|
||||
|
||||
//获取进程ID
|
||||
GetWindowThreadProcessId(hwnd, out int calcID);
|
||||
|
||||
//标题栏、进程id符合
|
||||
if ((sb.ToString() == FormName) && (instance != null) && (calcID == instance.Id))
|
||||
{
|
||||
//调用api函数,正常显示窗口
|
||||
ShowWindowAsync(hwnd, SW_RESTORE);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||
// 方法是按如下所示使用“*”:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.1.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.1.0.0")]
|
||||
[assembly: AssemblyVersion("1.2.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.2.0.0")]
|
||||
|
|
Loading…
Reference in New Issue