首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

百分探讨:求.Net完美隐藏主窗体方法,该如何处理

2011-12-31 
百分探讨:求.Net完美隐藏主窗体方法发了好多帖子,都是用的其他的方法。最常见的,就是在SubMain启动一个最小

百分探讨:求.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 System.Collections.Hashtable();


IntPtr hWnd;

public event HotkeyEventHandler OnHotkey;

public enum KeyFlags
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
[DllImport( "user32.dll ")]
public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk);

[DllImport( "user32.dll ")]
public static extern UInt32 UnregisterHotKey(IntPtr hWnd, UInt32 id);

[DllImport( "kernel32.dll ")]
public static extern UInt32 GlobalAddAtom(String lpString);

[DllImport( "kernel32.dll ")]
public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);

public Hotkey(IntPtr hWnd)
{
this.hWnd = hWnd;
System.Windows.Forms.Application.AddMessageFilter(this);
}

public int RegisterHotkey(System.Windows.Forms.Keys Key, KeyFlags keyflags)
{
UInt32 hotkeyid = GlobalAddAtom(System.Guid.NewGuid().ToString());
RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);
keyIDs.Add(hotkeyid, hotkeyid);
return (int)hotkeyid;
}

public void UnregisterHotkeys()
{
System.Windows.Forms.Application.RemoveMessageFilter(this);
foreach (UInt32 key in keyIDs.Values)
{
UnregisterHotKey(hWnd, key);
GlobalDeleteAtom(key);
}
}

public bool PreFilterMessage(ref System.Windows.Forms.Message m)
{
if (m.Msg == 0x312)
{
if (OnHotkey != null)
{
foreach (UInt32 key in keyIDs.Values)
{
if ((UInt32)m.WParam == key)
{
OnHotkey((int)m.WParam);
return true;
}
}
}
}
return false;
}
}
}

[解决办法]
设置窗体的透明读为0,不在任务拦显示

窗体的不透明度级别。默认值为 1.00
Form.Opacity

Form.ShowInTaskbar
如果为 true,则运行时在 Windows 任务栏中显示窗体;否则,为 false。默认为 true。



[解决办法]
lovingkiss(桃花影落飞神贱,碧海潮生 <吹> 玉箫 坦白从良 抗拒强奸) ( ) 信誉:100 Blog 加为好友 2007-06-22 13:51:14 得分: 0


wzd24(牧野),即使在Shown事件里面写两个
Me.Visible = False
Me.Hide()

也不行,任务栏上会出现一个窗体,点一下主界面就出来了。或者Alt+Tab也是可以切换出来的。


-------------------------------
崩溃啊~~~~~
我的成功隐藏了!都不能找到这个窗口,害我只能在任务管理器里面结束任务!!!
[解决办法]
要实现窗口隐藏方式多嘛!


你把Opactiy设置为0%或使用托盘来引导热键


热点排行