Example #1
0
        public static Point?GetIconPosition(string title)
        {
            var desktopHandle  = GetDesktopHandle();
            var desktopProcess = GetDesktopProcess(desktopHandle);

            var vItemCount = NM.SendMessage(desktopHandle, NM.LVM_GETITEMCOUNT, 0, 0);

            for (var item = 0; item < vItemCount; item++)
            {
                var iconTitle = GetIconTitle(desktopHandle, desktopProcess, item);

                if (string.Compare(title, 0, iconTitle, 0, title.Length, StringComparison.CurrentCultureIgnoreCase) == 0)
                {
                    var vPointer = NM.VirtualAllocEx(desktopProcess, IntPtr.Zero, (IntPtr)100,
                                                     NM.MEM_RESERVE | NM.MEM_COMMIT, NM.PAGE_READWRITE);

                    try
                    {
                        if (NM.SendMessage(desktopHandle, NM.LVM_GETITEMPOSITION, item, vPointer.ToInt32()) == 0)
                        {
                            return(null);
                        }

                        var vPoint             = new Point[1];
                        var vNumberOfBytesRead = new IntPtr(0);

                        NM.ReadProcessMemory(desktopProcess, vPointer,
                                             Marshal.UnsafeAddrOfPinnedArrayElement(vPoint, 0),
                                             (IntPtr)Marshal.SizeOf(typeof(Point)), ref vNumberOfBytesRead);

                        vPoint[0].X += Settings.Default.MonitorOffset.Width;
                        vPoint[0].Y += Settings.Default.MonitorOffset.Height;
                        return(vPoint[0]);
                    }

                    finally
                    {
                        NM.VirtualFreeEx(desktopProcess, vPointer, (IntPtr)0, NM.MEM_RELEASE);
                    }
                }
            }

            return(null);
        }
Example #2
0
        private static string GetIconTitle(IntPtr desktopHandle, IntPtr desktopProcess, int index)
        {
            var vPointer = NM.VirtualAllocEx(desktopProcess, IntPtr.Zero, (IntPtr)2048,
                                             NM.MEM_RESERVE | NM.MEM_COMMIT, NM.PAGE_READWRITE);

            try
            {
                var vBuffer            = new byte[256];
                var vNumberOfBytesRead = new IntPtr(0);

                var vItem = new NativeMethods.LVITEM[1];
                vItem[0].mask       = NM.LVIF_TEXT;
                vItem[0].iItem      = index;
                vItem[0].iSubItem   = 0;
                vItem[0].cchTextMax = vBuffer.Length;
                vItem[0].pszText    = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(NativeMethods.LVITEM)));

                NM.WriteProcessMemory(desktopProcess, vPointer,
                                      Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0),
                                      (IntPtr)Marshal.SizeOf(typeof(NativeMethods.LVITEM)), ref vNumberOfBytesRead);

                if (NM.SendMessage(desktopHandle, NM.LVM_GETITEMW, index, vPointer.ToInt32()) == 0)
                {
                    return(string.Empty);
                }

                NM.ReadProcessMemory(desktopProcess,
                                     (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(NativeMethods.LVITEM))),
                                     Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0),
                                     (IntPtr)vBuffer.Length, ref vNumberOfBytesRead);

                return(Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead));
            }

            finally
            {
                NM.VirtualFreeEx(desktopProcess, vPointer, (IntPtr)0, NM.MEM_RELEASE);
            }
        }