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); }
public static void SetIconPosition(string title, Point position) { if (string.IsNullOrEmpty(title)) { return; } 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) { NM.SendMessage(desktopHandle, NM.LVM_SETITEMPOSITION, item, (uint)position.X + ((uint)position.Y * 0x10000)); } } }
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); } }