C语言辅导:C#实现虚拟桌面计算机二级考试

文章作者 100test 发表时间 2009:07:25 10:38:23
来源 100Test.Com百考试题网


  背景:
  以前写过类似TurboLaunch的WPF版快捷方式管理软件,加入了3D动画,还集成了虚拟桌面,但是因为比较忙,自出了第一个版本后就不了了之了,Bug多多,也懒得改了,后来就渐渐忘记了。不巧的是,今天有位朋友向我要拖入可执行文件或者快捷方式生成缩略图的代码,才把它翻了出来,想想又好久没写Blog了,所以就单独拎出虚拟桌面这块做了个小Demo,和大家分享下。说到这个虚拟桌面,还是当时刚学C#那会在Winform下实现的,Oh,扯远了,进入正题。
  设计思路:
  虚拟桌面说白了就是将窗体分组进行显示,操作窗体的显隐藏,每个虚拟桌面可以包含多个窗体,考试@大提示只显示该虚拟桌面所包含的窗体。当然,桌面和任务栏是共享的,即所有的虚拟桌面都共用一个桌面和任务栏。
  下面列出用到的API
  private static class API
  {
  Import API#region Import API
  /**////
  /// 注册热键
  ///

  ///
  ///
  ///
  ///
  ///
  [DllImport("user32")]
  public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk).
  /**////
  /// 取消热键
  ///

  ///
  ///
  ///
  [DllImport("user32")]
  public static extern bool UnregisterHotKey(IntPtr hWnd, int id).
  /**////
  /// 该函数枚举所有屏幕上的顶层窗口
  ///

  ///
  ///
  ///
  [DllImport("user32")]
  public static extern bool EnumWindows(CallBack lpEnumFunc, int lParam).
  //[DllImport("user32")]
  //public static extern string GetWindowText(IntPtr hWnd, IntPtr lpString, int nMaxCount).//取得一个窗体的标题(caption)文字,或者一个控件的内容
  /**////
  /// 在指定的设备场景中描绘桌面墙纸图案
  ///

  ///
  ///
  [DllImport("user32", EntryPoint = "PaintDesktop")]
  public static extern int PaintDesktop(
  int hdc
  ).
  /**////
  /// 该函数返回桌面窗口的句柄
  ///

  ///
  [DllImport("user32")]
  public static extern IntPtr GetDesktopWindow().
  /**////
  /// 判断窗口是否可见
  ///

  ///
  ///
  [DllImport("user32")]
  public static extern int IsWindowVisible(IntPtr hWnd).
  /**////
  /// 获取指定窗体句柄
  ///

  ///
  ///
  ///
  [DllImport("user32")]
  public static extern IntPtr FindWindow(string LpClassName, string LpWindowName).
  /**////
  /// 该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
  ///

  ///
  ///
  ///
  ///
  ///
  [DllImport("user32")]
  public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow).
  /**////
  /// 该函数设置指定窗口的显示状态
  ///

  /// 目标窗口句柄
  /// 状态参数
  ///
  [DllImport("user32")]
  public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow).
  //[DllImport("user32")]
  //public static extern int GetClassName(IntPtr hWnd, string sClassName, int nMaxCount).
  #endregion
  }
  主要使用ShowWindow函数来设置窗体的显隐藏,其状态参数定义(API说明里是有10个的,不过我只定义了4个比较常用的)如下
  WindowAction
  private enum WindowAction
  {
  ///
  /// 隐藏窗口并激活其他窗口
  ///

  Hide = 0x00,
  ///
  /// 在窗口原来的位置以原来的尺寸激活和显示窗口
  ///

  Show = 0x04,
  ///
  /// 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。
  ///

  Restore = 0x03,
  ///
  /// 以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。
  ///

  ShowNoActivate = 0x08
  }
  在虚拟桌面间切换时,先清空当前窗体组(一个虚拟桌面对应一个窗体组),接着枚举所有窗体,保存状态为非隐藏的窗体句柄至当前窗体组,然后置该组所有窗体(除了桌面、任务栏和本虚拟软件程序)状态为WindowAction.Hide,然后置目标窗体组内所有窗体状态为WindowAction.ShowNoActivate。
  当然,不要忘记了在程序退出事件中加入显示所有窗体组中的窗体的代码,否则非当前组的窗体可就看不到了。
  源代码在VS2008下编译通过 。

相关文章


C语言辅导:不定参数在C语言中的应用实例计算机二级考试
C语言辅导:三种常见中文内码的转换方法计算机二级考试
C语言辅导:用vc设计系统援救程序计算机二级考试
应该怎样学习C语言?计算机二级考试
C语言辅导:C#实现虚拟桌面计算机二级考试
C语言辅导:C语言运算符表计算机二级考试
C#中避免相同MDI子窗口重复打开的方法计算机二级考试
NamedandOptionalParameters计算机二级考试
wince5.0下编译嵌入式操作系统sysgen阶段出错原因分析计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛