如果应用程序设置为默认 Windows 桌面 Shell,为什么我的 WndProc 收不到 Shell Hook 消息?

发布于 2024-10-09 13:34:42 字数 1027 浏览 5 评论 0原文

    uMsgNotify = WinApi.RegisterWindowMessage("SHELLHOOK");
    WinApi.RegisterShellHookWindow(this.Handle);

在我的 Form 构造函数中

,在我重写的 WndProc 中:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    IntPtr handle;
    if (m.Msg == uMsgNotify)
    {
        switch (m.WParam.ToInt32())
        {
            case WinApi.HSHELL_WINDOWCREATED:
                handle = m.LParam;
                string windowName = GetWindowName(handle);
                MessageBox.Show(windowName+" "+handle.ToString());
                break;
            case WinApi.HSHELL_WINDOWDESTROYED:
                handle = m.LParam;
                MessageBox.Show(handle.ToString());
                break;
        }
    }
    base.WndProc(ref m);
}

所以当默认的 Windows shell 是 explorer.exe 时,这个 Win Form 可以正常工作。我可以获得所有事件所有创建和销毁的窗口及其名称。当我将 app.exe 设置为默认 Windows Shell 时。它不接收消息。

我是否必须使用 dll 函数注入、单独的 dll 文件进行挂钩? 我试图获得更简单、更容易的解决方案。

有什么想法吗?

谢谢

    uMsgNotify = WinApi.RegisterWindowMessage("SHELLHOOK");
    WinApi.RegisterShellHookWindow(this.Handle);

in my Form constructor

and this in my overrided WndProc:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    IntPtr handle;
    if (m.Msg == uMsgNotify)
    {
        switch (m.WParam.ToInt32())
        {
            case WinApi.HSHELL_WINDOWCREATED:
                handle = m.LParam;
                string windowName = GetWindowName(handle);
                MessageBox.Show(windowName+" "+handle.ToString());
                break;
            case WinApi.HSHELL_WINDOWDESTROYED:
                handle = m.LParam;
                MessageBox.Show(handle.ToString());
                break;
        }
    }
    base.WndProc(ref m);
}

So this Win Form Works fine when default windows shell is explorer.exe. I can get all events All created and destroyed windows and their names. When i set my app.exe as defaul windows Shell. It doesn't receive messages.

Do I have to use dll function injection, separate dll file for hooking?
I was trying to get simplier and easier solution.

Any ideas?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

许久 2024-10-16 13:34:42

WH_SHELL 文档明确指出:

请注意,自定义 shell 应用程序不会
接收 WH_SHELL 消息。
因此,任何应用程序
将自身注册为默认 shell
必须调用 SystemParametersInfo
在它之前的函数(或任何其他
应用程序)可以接收WH_SHELL
消息。必须调用此函数
SPI_SETMINIMIZEDMETRICS
最小化指标 结构。设置
此结构的 iArrange 成员
ARW_HIDE。

The WH_SHELL documentation explicitly states:

Note that custom shell applications do not
receive WH_SHELL messages.
Therefore, any application that
registers itself as the default shell
must call the SystemParametersInfo
function before it (or any other
application) can receive WH_SHELL
messages. This function must be called
with SPI_SETMINIMIZEDMETRICS and a
MINIMIZEDMETRICS structure. Set the
iArrange member of this structure to
ARW_HIDE.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文