所有信息表明这是 Windows 3.x 版本及更高版本的 Windows 操作系统的主外壳。
我的问题是,这个程序如何访问整个 GUI 和屏幕/帧缓冲区数据来绘制和更改其上的内容,以及为什么其他程序不能执行它所做的事情,例如开始菜单和其他普通程序似乎无法触及的东西?
例如,在十六进制编辑器中检查程序表明它是与所有 Windows 可执行文件通用的普通 32 位 PE 可执行格式;但是,所有程序都无法接触开始菜单、任务栏等所在的屏幕数据。
我听说可以替换它,但是普通用户级程序是否可以更改它?如果不行,为什么?为什么简单地用另一个程序替换它就可以了?
更具体的细节:
explorer.exe 如何触及普通程序无法触及的屏幕内存部分?例如,我编写了一个包装 Windows API 的 SDL/C++ 应用程序。WinAPI 无法控制开始菜单等,而且据我所知,其他库也无法控制。explorer.exe 如何更改其他程序无法更改的这些区域的屏幕内存?
答案1
该程序如何访问整个 GUI 和屏幕/帧缓冲区数据来在其上绘制和更改内容。
它使用 API 调用来控制图形子系统,图形子系统使用驱动程序来控制视频适配器硬件。
为什么其他程序不能做到它的作用
他们可以,而且确实这么做了。Explorer.exe 不生成图形。
比如开始菜单和其他普通程序似乎无法触及的东西?
开始菜单和任务栏就是explorer.exe。
我听说可以更换它,
你没听错,它是可替换的。
但是普通用户级程序有可能改变它吗?
不可以,因为除非您有管理员权限来编辑注册表,否则您无法更改 shell。然后,一旦 EXE 被设置为 shell 并由 Windows 自动运行,它现在就在系统级上下文中运行,而不是在用户上下文中运行。
explorer.exe 如何触及正常程序无法触及的屏幕内存部分?
不会。它最多可以保护自己的内存空间不被其他程序更改,而且操作系统在大多数情况下都会提供这种保护。任何程序都可以接触屏幕的任何区域。由于硬件抽象,在 Windows 中不会直接访问“屏幕内存”。除非你谈论的是驱动程序,但你不是。
WinAPI 无法控制开始菜单等,据我所知,其他库也无法控制。explorer.exe 如何更改其他程序无法更改的这些区域的屏幕内存?
再次强调,Explerer.exe 就是“开始”菜单,“等等”。Explorer 使用 WinAPI 显示其窗口和控件(“开始”菜单和任务栏只是带有控件的窗口)。
尝试这个实验:打开任务管理器,并杀死您看到的所有 Explorer.exe 副本。当您杀死最后一个副本时,您会注意到开始菜单和任务栏消失了。
然而,即使没有运行 Explorer.exe,其他程序仍然在运行并且仍然可见。您甚至可以使用任务管理器来启动新程序;它们将启动并可见,包括窗口和按钮等。:)
这篇 CodeProject 文章可能会帮助您入门,并从编程的角度帮助您了解如何修改 Explorer 元素(在本例中为“开始”按钮):在 Windows Vista 和 Windows 7 中隐藏任务栏和开始菜单(启动球)