c++ - 如何更改explorer.exe中NotifyIcon的上下文菜单?

标签 c++ explorer notifyicon dll-injection easyhook

我想使用新项目扩展默认扬声器通知的(托盘图标)右键单击上下文菜单。另外,我想使用 C++ 处理鼠标点击。

插图

enter image description here

到目前为止我所知道的

我学习了如何使用 CreateRemoteThread() 进行 dll 注入(inject),因为我认为这就是正确的方法。我的问题是:在注入(inject)的 dll 内部做什么?例如,如何访问NotifyIcon对象?

也许通过简单的 Windows API 调用就可以实现,但我对此并不熟悉。

最佳答案

感谢卢克的提示。我使用 EasyHook 让它工作。我选择它,因为它也支持 64 位 dll 注入(inject)。

要注入(inject)的 DLL:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using EasyHook;
namespace InjectDLL
    {
    public class Main : EasyHook.IEntryPoint
    {
        LocalHook CreateTrackPopupMenuExHook;
        public Main(RemoteHooking.IContext InContext){}
        public void Run(RemoteHooking.IContext InContext)
        {
            try
            {
                CreateTrackPopupMenuExHook = LocalHook.Create(
                    LocalHook.GetProcAddress("user32.dll", "TrackPopupMenuEx"),
                    new DTrackPopupMenuEx(TrackPopupMenuEx_Hooked),
                    this);
                CreateTrackPopupMenuExHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
            }
            catch
            {
                return;
            }
            while (true)
            {
                Thread.Sleep(500);
            }
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool AppendMenu(IntPtr hMenu, long uFlags, int uIDNewItem, string lpNewItem);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        static extern IntPtr TrackPopupMenuEx(
            IntPtr hMenu,
            uint fuFlags,
            int x,
            int y,
            IntPtr hwnd,
            IntPtr lptpm);

        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
        delegate IntPtr DTrackPopupMenuEx(
            IntPtr hMenu,
            uint fuFlags,
            int x,
            int y,
            IntPtr hwnd,
            IntPtr lptpm);

        const long MF_STRING = 0x00000000L;
        const long MF_SEPARATOR = 0x00000800L;

        static IntPtr TrackPopupMenuEx_Hooked(
            IntPtr hMenu,
            uint fuFlags,
            int x,
            int y,
            IntPtr hwnd,
            IntPtr lptpm)
        {
            IntPtr returnValue = IntPtr.Zero;
            try
            {
                    //Separator
                    AppendMenu(hMenu, MF_SEPARATOR, 0, null);
                    //New menu item
                    AppendMenu(hMenu, MF_STRING, 40010, "TestMenuItem");
                    //call the default procedure
                    returnValue = TrackPopupMenuEx(hMenu, fuFlags, x, y, hwnd, lptpm);
                    //our menu item is selected
                    if (returnValue == (IntPtr)40010)
                    {
                        /* CODE HERE */
                        returnValue = IntPtr.Zero;
                    }
                    return returnValue;
            }
            catch
            {
                return;
            }
            return returnValue;
        }
    }
}

关于c++ - 如何更改explorer.exe中NotifyIcon的上下文菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11308258/

相关文章:

c++ - 在C++中按引用调用或按值调用

c++ - 如何测试 std::function<T> 是否可构造为模板参数 T

c# - 重复的文本查找

powershell - 在资源管理器中对选定文件执行 PowerShell 命令

c# - 将鼠标悬停在通知图标上显示文本

c# - 如何将 WinForms 应用程序最小化到通知区域?

c++ - 返回子类的 const 引用

windows - FTP 客户端 Filezilla 和 Ftpuse 可以工作,但 Windows 资源管理器无法使用 PASV 模式

java - 文件名在 Android Studio 的 TextView 中显示不正确

c# - 我可以在 WPF 中使用 NotifyIcon 吗?