【问题标题】:Hook for API function GetSystemMetricsAPI 函数 GetSystemMetrics 的挂钩
【发布时间】:2012-09-18 12:42:12
【问题描述】:

请帮我为 AP.I 函数 GetSystemMetrics 创建钩子。 我希望当某些应用程序(例如 calc.exe)调用 GetSystemMetrics 时,它们会收到我的值(例如 500x500),而其他应用程序会获得正确的屏幕尺寸。 如果有人能告诉我如何使用 C# 和 .net CF 2.0 做到这一点,我会非常高兴。

谢谢,希望对你有所帮助。

【问题讨论】:

标签: c# windows api compact-framework windows-ce


【解决方案1】:

我认为在 C#/.NET 中不编写任何本机代码是不可能的。然而,好消息是有一个很棒的库,叫做 madCodeHook,它真的很容易使用。看看http://madshi.net/

【讨论】:

    【解决方案2】:

    即使在本机代码中,您也无法做到这一点(至少在没有丑陋、坏主意、vtable/内核内存黑客的情况下,这些黑客可能会或可能不会继续跨操作系统版本工作)。 GetSystemMetrics 调用操作系统以获取有关平台的信息。除了重新编译操作系统并更改这些值之外,您无法“覆盖”这些值并让操作系统报告其他数字(当然,除非操作系统已经以这些数字来自的方式构建你的应用可以修改的地方——比如注册表)。

    编辑

    根据您的 cmets,您的实际问题是您正在尝试创建某种形式的“任务栏”类型的应用程序,并且您希望不受您控制的其他应用程序在最大化时不会覆盖您的任务栏。这正是现有 Explorer 任务栏的工作方式,所以我的建议是查看默认的 shell 源代码,看看它是如何完成的。

    最终结果很可能是您要么克隆现有的 shell 代码并修改现有的任务栏以满足您的需要,要么创建一个具有您想要的行为的全新 shell 应用程序,但您几乎当然必须更换外壳,而这只能用本机代码来完成。

    【讨论】:

    • 当然可以;这将是可怕的。
    • 也许我可以创建类似屏幕区域的东西并在这个区域/沙箱中运行这个应用程序?
    • 如果你想创建一个自定义的“任务栏”类型的东西,你真的只需要写一个 shell 替换。
    • @ctacke 少数应用程序在运行后具有全屏尺寸,并且任务栏隐藏其窗口的底部,因为此应用程序使用 GetSystemMetrics 获取屏幕尺寸。
    • 然后重建内核并让它响应你想要的大小。
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多