在嵌入式系统开发中,经常需要创建一个特定的用户界面,以确保用户只能访问特定的应用程序或功能。本文将介绍一个用于锁定Windows Mobile启动菜单的DLL库和示例应用程序,该库支持禁用开始菜单图标的点击和使用Win键打开Windows Mobile开始菜单,同时提供了禁用整个开始菜单栏和将窗口设置为全屏模式的功能。
该DLL库提供了以下功能:
以下是DLL导出的函数列表:
void __stdcall LockStartMenu(); // 禁用开始菜单的点击
void __stdcall UnlockStartMenu(); // 启用开始菜单的点击
void __stdcall LockStartBar(); // 禁用整个开始菜单栏
void __stdcall UnlockStartBar(); // 启用开始菜单栏
bool __stdcall Lockdown(TCHAR*); // 将应用程序设置为全屏模式
bool __stdcall Unlockdown(); // 将应用程序恢复为正常窗口模式
要禁用开始菜单的点击,可以使用LockStartMenu()
函数。这个函数通过子类化(hook)HHTaskbar窗口过程来实现。子类化窗口意味着代码会在原始窗口接收到的每个消息上执行。在子类化窗口时,会安装一个新的窗口过程(wndproc),这个新的wndproc会在原始窗口的wndproc之前被调用,因此可以在原始WndProc之外操纵事情。
新的窗口过程会检查左键点击的坐标(WM_LBUTTONDOWN
)。如果点击位置的x和y值在任务栏高度内,并且不超过屏幕宽度的2/3,则点击不会被转发到任务栏窗口。这样,HHTaskbar就不会收到点击通知,也不会打开开始菜单。
第二对DLL函数是LockStartBar()
和UnlockStartBar()
。这些函数通过查找类名为HHTaskbar的窗口并禁用该窗口来实现。禁用窗口可以防止窗口过程接收到更多的窗口消息,因此只要窗口被禁用,HHTaskbar就不会接收到任何点击。
最后一对函数使用已知的组合式kiosk模式技术:LockDown(TCHAR*)
和UnLockDown()
。这些函数首先检查是否已经对具有给定标题文本的窗口执行了锁定。如果没有,它会搜索具有指定标题的窗口句柄。如果找到窗口,将其设置为前台,然后调用Microsoft API调用来使窗口全屏。窗口也被设置为全屏(当前硬编码的屏幕尺寸,如果需要,可以更改),并调用LockStartMenu
函数。