DirectUI和无窗口用户界面

原创 2010年03月22日 14:08:00

DirectUI/DirectUser是一个用户界面框架(http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.frameworkid.aspx)。用Spy++可以在MSN Messenger、Windows XP、Office、IE和Windows Media Player中看到窗口类名字是DirectUIHWND的窗口。

 

从文件描述来看,DUI70.dll和DUser.dll看起来是这个框架的实现文件,而没有导入这些DLL的软件应该是复制了这个库的代码。举例来说,Windows Vista和IE7的测试版的IEFrame.dll导入了DUser.dll(http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/6b801577-1699-4093-8a58-198c64b120e0)而正式版使用IEUI.DLL。这应该是微软不愿意公开支持这个功能变化频繁的类库,而反垄断案禁止非Windows组件调用未公开Windows API的缘故。

 

 

再看看DUser.dll的函数导出表(http://www.webtropy.com/articles/dll-api.aspx?dll=duser),可以看到Gadget这个词被广泛使用,而没有具体的控件。因为没有窗口句柄,所以控件不是用的窗口类来区分,而是可能和Windows Vista Sidebar Gadgets一样采用HTML做接口根据Office Communicator的资源来看,是使用XML做接口。

 

从这个类库的名字和行为来看,实际上应该是基于DirectX,和WPF类似的界面类库框架。在微软的招聘网站上可以看到Office Communications项目组的一个职位的介绍中描述说“Native Win32/64 UX experience via DirectUI, and Web UX experience via Silverlight”,说明这个项目组把它和Silverlight同等对待。DirectUIHWND窗口可以在需要性能和安全性的场合看到,例如IE的Tab窗口、Shell中的DefView、Windows登录界面等等。在Windows Vista上使用DirectUI的微软程序和WPF程序一样兼容Desktop Composition和远程桌面,应该是直接或者间接调用的Direct3D。

 

那么我们怎么做到类似的效果?

 

无窗口模式的用户界面并不是一个新的概念(http://blogs.msdn.com/oldnewthing/archive/2005/02/11/371042.aspx),Visual C++的应用程序向导就可以创建无窗口ActiveX。但是做过无窗口模式的RichEdit的实现的人都知道,微软的系统控件集中了各种各样的功能,比如各种快捷键、滚动条、界面风格、Accessibility、用户界面自动化等等,要像IE项目组那样几乎完全实现无窗口并不容易。Raymond Chen在http://blogs.msdn.com/oldnewthing/archive/2005/02/11/371042.aspx提到可以使用DrawThemeBackground和DrawFrameControl这两个API,不过这只对和Windows界面风格一致的程序有用。要是界面不复杂的话,可以简单的集成IE的Trident引擎,比如使用MFC的CHTMLView和CDHTMLDialog,以及Windows Forms的WebBrowser类。这样做的代价就是程序需要牺牲性能和可能在严格的IE安全性配置下无法工作,Visual Studio.Net开始的各种向导、Google Task、Microsoft Outlook、Outlook Express等就是使用的这种方案。

 

另外一个方案就是集成WPF或者Silverlight。VC项目组在用户调查中发现,需要使用WPF的Visual C++用户大都用C#编写WPF代码再用C++/CLI和非托管代码做接口(http://social.msdn.microsoft.com/forums/en-US/wpf/thread/dd1e31bb-feb4-4d77-b524-42a282f519b1/),所以他们决定致力于改进更多用户使用的功能,例如编辑器的智能感知,而不提供对WPF的支持。Visual Studio 2010就是使用这种方案。

 

为什么不能使用未公开的API?如果要看惊恐故事的话,可以参考http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspxhttp://blogs.technet.com/stefan_gossner/archive/2005/07/27/undocumented_API_Part1.aspx

 

题后话:

*如果微软在产品文档中讨论未公开的API,那么API还是未公开的吗?(http://msdn.microsoft.com/en-us/library/aa140182(office.10).aspx

*Visual Studio代码画廊中有个叫作DirectUI的类库,设计思想和微软的DirectUser库类似(http://visualstudiogallery.msdn.microsoft.com/en-us/1B69C9FE-E422-4799-9EB5-6AC7034C52E1),不过也有人误认为这就是微软用来实现MSN的界面的库。

*IE9将会使用Dierct2D作为渲染引擎,不知道IE项目组在移植完代码之后是否能把控件类库的接口公开。从VC项目组征求下一个版本意见的问题(http://www.surveymonkey.com/s/HDQWGJR)来看,微软也有意开发利用GPU的类库。

 

 

DirectUI浅谈

DirectUI是一个软件设计思想,这个思想来源于Windowless理念,这个思想可以表述为“只有主窗口有句柄,其他的窗口都是以控件的形式被绘制出来”,所有采用这个思想设计的开发框架都可以称为Dir...
  • guoxudong2012
  • guoxudong2012
  • 2016年05月15日 10:24
  • 1345

.NET下基于API封装的DirectUIHWND窗体访问

 直接切入正题:    1.添加引用. 项目->添加引用->C:/Progmme~1/MSN Messenger/msnmsgr.exe    2. using MessengerAPI;    声明...
  • tolys
  • tolys
  • 2006年10月01日 12:26
  • 12654

发现一个windows7(32bit或64bit)DirectUI的bug

前段时间发现一个windows7的一个bug,不是什么严重的问题,我在此记录下。(转载请指明出于breaksoftware的csdn博客)         重现步骤如下:         0 在文件夹...
  • breaksoftware
  • breaksoftware
  • 2013年04月23日 17:54
  • 2109

国内首个directui开源界面库---Duilib

来自:http://www.oschina.net/p/duilib 国内首个开源 的directui 界面库,开放,共享,惠众,共赢,遵循bsd协议,可以免费用于商业项目,目前支持Window...
  • shanzhizi
  • shanzhizi
  • 2013年12月23日 15:05
  • 3251

DirectUI界面库

DirectUI界面库 取名自微软的一个窗口类名“DirectUIHWND”,意为Paint on parent dc directly。即子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口...
  • fwj380891124
  • fwj380891124
  • 2012年10月05日 10:49
  • 2591

DirectUI的初步分析

最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是有距离的,不过其实现还是很有意思的...
  • weiqubo
  • weiqubo
  • 2012年01月12日 09:51
  • 4670

跟大家分享一下directUI的心得

original url : http://bbs.csdn.net/topics/340239295 0. WPF, Windows Live, QQ 和 百度 hi 的界面其实并不神秘。...
  • LostSpeed
  • LostSpeed
  • 2014年01月04日 09:35
  • 1125

基于MFC的DirectUI程序的消息响应设计

所以消息的获取仍然是来自主窗口,也就是MFC自己的一套消息映射,比如鼠标点击的消息,在主窗口截获,然后通过相关的处理,调用虚子窗口(DirectUI程序中的控件一般不是真正的窗口,没有m_hwnd,暂...
  • zxm342698145
  • zxm342698145
  • 2015年01月13日 15:09
  • 1714

DirectUI实现原理

传统的MFC程序
  • passion_wu128
  • passion_wu128
  • 2014年08月06日 15:13
  • 11817

DirectUI界面编程(四)界面布局详解

Duilib的界面布局使用xml文件进行描述,在Duilib v1.1版本的xml布局文件中我们可以使用以下这些标签(后续版本标签有扩充): 这些标签总的来讲可以分为三类: 窗口类,该类别中只有一个...
  • Rongbo_J
  • Rongbo_J
  • 2015年07月24日 22:53
  • 3006
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectUI和无窗口用户界面
举报原因:
原因补充:

(最多只允许输入30个字)