/// <summary>
/// 构造函数
/// </summary>
public FrmMain()
{
if (this.TryCheckSingleton()){
Environment.Exit(0);
}
}
//单一线程同步事件
private EventWaitHandle ewhSingleton;
//保存CMIS Windows 消息编号
private int WM_CMISSTARTED;
#region 单一客户端实例
/// <summary>
/// 验证单一线程
/// </summary>
/// <returns></returns>
private bool TryCheckSingleton(){
try{
this.WM_CMISSTARTED = (int)RegisterWindowMessage("CmisStarted");
bool flag;
this.ewhSingleton = new EventWaitHandle(false, EventResetMode.AutoReset, "CmisInstance", out flag);
if (!flag){
PostMessage((IntPtr)0xffff, this.WM_CMISSTARTED, 0, 0);
}
return !flag;
}catch (Exception){
return false;
}
}
/// <summary>
/// 激活主窗口
/// </summary>
private void ActiveMainWindow()
{
base.Activate();
BringWindowToTop(base.Handle);
}
/// <summary>
/// 获得 Windows 消息
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
if (m.Msg == this.WM_CMISSTARTED){
this.ActiveMainWindow();
return;
}
base.WndProc(ref m);
}
#region Windows API 声明
/// <summary>
/// 注册Windows消息
/// </summary>
/// <param name="lpString">注册消息的名字</param>
/// <returns>消息编号</returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint RegisterWindowMessage(string lpString);
/// <summary>
/// 该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里
/// </summary>
/// <param name="hWnd">接收消息的窗口句柄</param>
/// <param name="Msg">被寄送的消息</param>
/// <param name="wParam">附加的消息特定的信息</param>
/// <param name="lParam">附加的消息特定的信息</param>
/// <returns>函数调用成功,返回非零值;如果函数调用失败,返回值是零</returns>
[DllImport("user32.dll")]
public static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
/// <summary>
/// 该函数将指定的窗口设置到Z序的顶部
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <returns>如果函数成功,返回值为非零;如果函数失败,返回值为零</returns>
[DllImport("user32.dll")]
public static extern bool BringWindowToTop(IntPtr hWnd);
#endregion
#endregion
分享到:
相关推荐
48 实例048 向提示框中添加图标 49 第2章 控件应用 51 2.1 TextBox控件应用 52 实例049 只允许输入数字的TextBox控件 52 实例050 限制用户名称长度及设置密码文本 54 实例051 自动删除...
1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...
1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...
1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...
实例032 开发一个猜数字游戏 第4章 字符与字符串 实例033 字母与ascii码的转换 实例034 获取字符串中汉字的个数 实例035 从字符串中分离文件路径、文件名及扩展名 实例036 对字符串进行加密与解密 实例037 开发一个...
实例032 开发一个猜数字游戏 45 第4章 字符与字符串 47 实例033 字母与ascii码的转换 48 实例034 获取字符串中汉字的个数 50 实例035 从字符串中分离文件路径、文件名及扩展名 51 实例036 对字符串进行加密与解密 53...
1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...