日期:2014-05-19  浏览次数:20916 次

百分探讨:求.Net完美隐藏主窗体方法
发了好多帖子,都是用的其他的方法。
最常见的,就是在
Sub   Main启动一个   最小化+不显示在任务栏的窗体
然后在Shown事件进行窗体的隐藏....
================================================
问题在于,如果进行任务栏显示、隐藏切换,就会造成窗体句柄的变化
如果我在启动的时候注册了热键,将无法正确使用。

当窗体在是否显示任务栏之间切换,发现窗体的Handle发生了变化。
这就造成设置热键之类的操作全部失效。。。。
而且是切换一次,Handle变一次.........崩溃中....
我可不想切换一次就注册一次吧?
如果在Shown事件中
Me.Visible   =   False
Me.ShowInTaskbar   =   True
MyHotkey.RegisterHotKey..........
也是无法隐藏,任务栏还是会存在该窗体的影子。。。
================================================
.Net对隐藏一个窗体,并设置热键——这么简单的东西竟然弄得我焦头烂额,而且发的帖子好多人都说,阿,这个东西好简单,你好笨,然后给了一堆网络上到处都可以搜索来的代码...

也许,我也越发地发现自己笨~~~~~~~~~~~~~~~~~~~~~~~~~~
可就是找不到好用的代码。。。。。。。。。。。。。。。。

[请不要给我注册热键之类的代码,告诉我应该怎么做就可以了]

------解决方案--------------------
Me.ShowInTaskbar会导致窗体的句柄改变。
--------------------
[DefaultValue(true), SRDescription( "FormShowInTaskbarDescr "), SRCategory( "CatWindowStyle ")]
public bool ShowInTaskbar
{
get
{
return (this.formState[FormStateTaskBar] != 0);
}
set
{
if (!this.IsRestrictedWindow && (this.ShowInTaskbar != value))
{
if (value)
{
this.formState[FormStateTaskBar] = 1;
}
else
{
this.formState[FormStateTaskBar] = 0;
}
if (base.IsHandleCreated)
{
base.RecreateHandle();//这里改变了窗体的Handle;
}
}
}
}
--------------------------
用Hide()方法不会出现这种现象!
------解决方案--------------------
确实存在这样的情况,不过你在你的上一贴中我最后一次回复的代码再稍做修改就可以满足要求,不写代码还不太好说,不知道你的程序的多文档还是单文档?是同时隐藏多个窗体还是程序始终只有一个活动窗体?
------解决方案--------------------
//以下代码,经测试热键实现主窗体隐藏/显示半点问题都没有:

/*-- 文件: Form1.cs ---*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
public partial class Form1 : Form
{
private int Hotkey1;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Hotkey hotkey;
hotkey = new Hotkey(this.Handle);
Hotkey1 = hotkey.RegisterHotkey(System.Windows.Forms.Keys.F1, Hotkey.KeyFlags.MOD_CONTROL);//定义快键(Ctrl + F1)
hotkey.OnHotkey += new HotkeyEventHandler(OnHotkey);
}

public void OnHotkey(int HotkeyID)
{
if (HotkeyID == Hotkey1)
{
if (this.Visible == true)
this.Visible = false;
else
this.Visible = true;
}
else
{
this.Visible = false;
}
}
}
}


/* 文件 Hotkey.cs */
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace WindowsApplication3
{
public delegate void HotkeyEventHandler(int HotKeyID);
public class Hotkey : System.Windows.Forms.IMessageFilter
{
System.Collections.Hashtable keyIDs = new Syst