C语言辅导:C#实现虚拟桌面
背景:
我曾经写过类似TurboLaunch的WPF版快捷方式管理软件,增加了3D动画,集成了虚拟桌面。但是因为我比较忙,第一版之后就不了了之了。bug很多,我也懒得改。后来,我渐渐忘记了。可惜今天有朋友让我拖动可执行文件或者快捷方式的代码生成缩略图,然后翻出来。想来想去,好久没写博客了,就单独把虚拟桌面拿出来做了一个小Demo和大家分享一下。说到这个虚拟桌面,当时刚学C#,在Winform下就会实现。哦,跑题了,言归正传。
设计思路:
说白了,虚拟桌面就是将表单分组显示,隐藏和显示表单。每个虚拟桌面可以包含多个表单,只显示虚拟桌面中包含的表单。当然,桌面和任务栏是共享的,即所有虚拟桌面共享一个桌面和任务栏。
使用的API
私有静态类API
{
导入API # region Import API
/* *//
//注册热键
///////。
///
///
//
//
[DllImport(" user 32 ")]
public static extern bool register hotkey(IntPtr hWnd,int id,uint control,Keys vk);
/* *///
//取消热键
//
//
[DLLimport(")
/* *///
//此函数枚举所有屏幕上的顶层窗口
//
/
/[DLLimport(" user 32 ")]
//公共静态外部字符串GetWindowText(intpttext//获取一个窗体的标题文本,或者一个控件的内容
/* *//
//在指定的设备场景中绘制桌面壁纸图案
//
//
//entry point = " paint desktop ")]
public static extern int paint desktop(
int hdc
);
/* *//
//该函数返回桌面窗口的句柄
//
[dllimport(" user 32 ")]
public static external int。
/* *///
//判断窗口是否可见
//
//
[DLLimport(" user 32 ")][/
/* *///
//获取指定的窗体句柄
///
//
//
[DLLimport(public static extern int ptr FindWindow(string LP class name,string LPL
/* *///
//此函数获取一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数寻找子窗口,从给定子窗口之后的下一个子窗口开始。搜索不区分大小写。
///
///
///
///
///
//
[DllImport(" user 32 ")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow);
/* *///
//此函数设置指定窗口的显示状态
//
//目标窗口句柄
//状态参数
///[/br public static extern bool show window(IntPtr hWnd,int nCmdShow);
//[DllImport(" user 32 ")]
//public static extern int get class name(IntPtr hWnd,string sClassName,int nmax count);
# end region
}
show Window函数主要用于设置窗体的显示和隐藏,其状态参数定义如下(API描述中有10个,不过我只定义了4个常用的)
Window Action
Private Enum Window Action
{
///隐藏窗口并激活其他窗口
/
Hide =
///
如果窗口被最小化或最小化,系统会将窗口恢复到原来的大小和位置。当还原最小化窗口时,应用程序应该指定此标志。
//
restore = 0x03,
//
//以最新大小和状态显示窗口。激活窗口保持活动状态。
//
showno activate = 0x 08
}
在虚拟桌面之间切换时,先清除空当前窗体组(一个虚拟桌面对应一个窗体组),然后枚举所有窗体,将非隐藏窗体的句柄保存到当前窗体组。然后,这个组中的所有表单(除了桌面、任务栏和这个虚拟软件程序)都被设置为WindowAction。隐藏,然后目标窗体组中的所有窗体都设置为WindowAction。ShowNoActivate
当然,不要忘了在程序退出事件中包含显示窗体组中所有窗体的代码,否则不在当前组中的窗体将不可见。
源代码在VS2008下编译通过。
0条评论