Anonymous
Как переместить сетку значков рабочего стола с верхних 150 пикселей вниз
Сообщение
Anonymous » 14 дек 2024, 16:03
Существует ли какой-либо метод WinAPI для перемещения сетки значков рабочего стола сверху экрана, например, на 150 пикселей ниже?
Я использую этот код для перемещения значков снизу сверху экрана, но неработающие значки снова возвращаются в положение по умолчанию:
Код: Выделить всё
internal class Desktop
{
private readonly IntPtr _desktopHandle;
private readonly List _currentIconsOrder;
public Desktop()
{
_desktopHandle = Win32.GetDesktopWindow(Win32.DesktopWindow.SysListView32);
AutomationElement el = AutomationElement.FromHandle(_desktopHandle);
TreeWalker walker = TreeWalker.ContentViewWalker;
_currentIconsOrder = new List();
for (AutomationElement child = walker.GetFirstChild(el);
child != null;
child = walker.GetNextSibling(child))
{
_currentIconsOrder.Add(child.Current.Name);
}
}
private int GetIconsNumber()
{
return (int)Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);
}
public NamedDesktopPoint[] GetIconsPositions()
{
uint desktopProcessId;
Win32.GetWindowThreadProcessId(_desktopHandle, out desktopProcessId);
IntPtr desktopProcessHandle = IntPtr.Zero;
try
{
desktopProcessHandle = Win32.OpenProcess(Win32.ProcessAccess.VmOperation | Win32.ProcessAccess.VmRead |
Win32.ProcessAccess.VmWrite, false, desktopProcessId);
return GetIconsPositions(desktopProcessHandle);
}
finally
{
if (desktopProcessHandle != IntPtr.Zero)
{ Win32.CloseHandle(desktopProcessHandle); }
}
}
private NamedDesktopPoint[] GetIconsPositions(IntPtr desktopProcessHandle)
{
IntPtr sharedMemoryPointer = IntPtr.Zero;
try
{
sharedMemoryPointer = Win32.VirtualAllocEx(desktopProcessHandle, IntPtr.Zero, 4096, Win32.AllocationType.Reserve | Win32.AllocationType.Commit, Win32.MemoryProtection.ReadWrite);
return GetIconsPositions(desktopProcessHandle, sharedMemoryPointer);
}
finally
{
if (sharedMemoryPointer != IntPtr.Zero)
{
Win32.VirtualFreeEx(desktopProcessHandle, sharedMemoryPointer, 0, Win32.FreeType.Release);
}
}
}
private NamedDesktopPoint[] GetIconsPositions(IntPtr desktopProcessHandle, IntPtr sharedMemoryPointer)
{
var listOfPoints = new LinkedList();
var numberOfIcons = GetIconsNumber();
for (int itemIndex = 0; itemIndex < numberOfIcons; itemIndex++)
{
uint numberOfBytes = 0;
DesktopPoint[] points = new DesktopPoint[1];
Win32.WriteProcessMemory(desktopProcessHandle, sharedMemoryPointer,
Marshal.UnsafeAddrOfPinnedArrayElement(points, 0),
Marshal.SizeOf(typeof(DesktopPoint)),
ref numberOfBytes);
Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMPOSITION, itemIndex, sharedMemoryPointer);
Win32.ReadProcessMemory(desktopProcessHandle, sharedMemoryPointer,
Marshal.UnsafeAddrOfPinnedArrayElement(points, 0),
Marshal.SizeOf(typeof(DesktopPoint)),
ref numberOfBytes);
var point = points[0];
listOfPoints.AddLast(new NamedDesktopPoint(_currentIconsOrder[itemIndex], point.X, point.Y));
}
return listOfPoints.ToArray();
}
public void SetIconPositions(IEnumerable iconPositions)
{
foreach (var position in iconPositions)
{
var iconIndex = _currentIconsOrder.IndexOf(position.Name);
if (iconIndex == -1)
{ continue; }
Win32.SendMessage(_desktopHandle, Win32.LVM_SETITEMPOSITION, iconIndex, Win32.MakeLParam(position.X, position.Y));
}
}
public void SetDefaultIconPositions(IEnumerable iconPositions)
{
foreach (var position in iconPositions)
{
var iconIndex = _currentIconsOrder.IndexOf(position.Name);
if (iconIndex == -1)
{ continue; }
Win32.SendMessage(_desktopHandle, Win32.LVM_SETITEMPOSITION, iconIndex, Win32.MakeLParam(position.X, position.Y));
}
}
public void Refresh()
{
Win32.PostMessage(_desktopHandle, Win32.WM_KEYDOWN, Win32.VK_F5, 0);
Win32.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
}
}
Я хотел бы получить этот графический интерфейс:
[img]https:// i.sstatic.net/e82Iuqbv.png[/img]
Детали изображения: Высота приложения составляет 150 пикселей, и я пытаюсь переместить значки ниже этого приложения.< /p>
Можно ли этого добиться это?
Подробнее здесь:
https://stackoverflow.com/questions/792 ... ixel-below
1734181386
Anonymous
Существует ли какой-либо метод WinAPI для перемещения сетки значков рабочего стола сверху экрана, например, на 150 пикселей ниже? Я использую этот код для перемещения значков снизу сверху экрана, но неработающие значки снова возвращаются в положение по умолчанию: [code]internal class Desktop { private readonly IntPtr _desktopHandle; private readonly List _currentIconsOrder; public Desktop() { _desktopHandle = Win32.GetDesktopWindow(Win32.DesktopWindow.SysListView32); AutomationElement el = AutomationElement.FromHandle(_desktopHandle); TreeWalker walker = TreeWalker.ContentViewWalker; _currentIconsOrder = new List(); for (AutomationElement child = walker.GetFirstChild(el); child != null; child = walker.GetNextSibling(child)) { _currentIconsOrder.Add(child.Current.Name); } } private int GetIconsNumber() { return (int)Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero); } public NamedDesktopPoint[] GetIconsPositions() { uint desktopProcessId; Win32.GetWindowThreadProcessId(_desktopHandle, out desktopProcessId); IntPtr desktopProcessHandle = IntPtr.Zero; try { desktopProcessHandle = Win32.OpenProcess(Win32.ProcessAccess.VmOperation | Win32.ProcessAccess.VmRead | Win32.ProcessAccess.VmWrite, false, desktopProcessId); return GetIconsPositions(desktopProcessHandle); } finally { if (desktopProcessHandle != IntPtr.Zero) { Win32.CloseHandle(desktopProcessHandle); } } } private NamedDesktopPoint[] GetIconsPositions(IntPtr desktopProcessHandle) { IntPtr sharedMemoryPointer = IntPtr.Zero; try { sharedMemoryPointer = Win32.VirtualAllocEx(desktopProcessHandle, IntPtr.Zero, 4096, Win32.AllocationType.Reserve | Win32.AllocationType.Commit, Win32.MemoryProtection.ReadWrite); return GetIconsPositions(desktopProcessHandle, sharedMemoryPointer); } finally { if (sharedMemoryPointer != IntPtr.Zero) { Win32.VirtualFreeEx(desktopProcessHandle, sharedMemoryPointer, 0, Win32.FreeType.Release); } } } private NamedDesktopPoint[] GetIconsPositions(IntPtr desktopProcessHandle, IntPtr sharedMemoryPointer) { var listOfPoints = new LinkedList(); var numberOfIcons = GetIconsNumber(); for (int itemIndex = 0; itemIndex < numberOfIcons; itemIndex++) { uint numberOfBytes = 0; DesktopPoint[] points = new DesktopPoint[1]; Win32.WriteProcessMemory(desktopProcessHandle, sharedMemoryPointer, Marshal.UnsafeAddrOfPinnedArrayElement(points, 0), Marshal.SizeOf(typeof(DesktopPoint)), ref numberOfBytes); Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMPOSITION, itemIndex, sharedMemoryPointer); Win32.ReadProcessMemory(desktopProcessHandle, sharedMemoryPointer, Marshal.UnsafeAddrOfPinnedArrayElement(points, 0), Marshal.SizeOf(typeof(DesktopPoint)), ref numberOfBytes); var point = points[0]; listOfPoints.AddLast(new NamedDesktopPoint(_currentIconsOrder[itemIndex], point.X, point.Y)); } return listOfPoints.ToArray(); } public void SetIconPositions(IEnumerable iconPositions) { foreach (var position in iconPositions) { var iconIndex = _currentIconsOrder.IndexOf(position.Name); if (iconIndex == -1) { continue; } Win32.SendMessage(_desktopHandle, Win32.LVM_SETITEMPOSITION, iconIndex, Win32.MakeLParam(position.X, position.Y)); } } public void SetDefaultIconPositions(IEnumerable iconPositions) { foreach (var position in iconPositions) { var iconIndex = _currentIconsOrder.IndexOf(position.Name); if (iconIndex == -1) { continue; } Win32.SendMessage(_desktopHandle, Win32.LVM_SETITEMPOSITION, iconIndex, Win32.MakeLParam(position.X, position.Y)); } } public void Refresh() { Win32.PostMessage(_desktopHandle, Win32.WM_KEYDOWN, Win32.VK_F5, 0); Win32.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero); } } [/code] Я хотел бы получить этот графический интерфейс: [img]https:// i.sstatic.net/e82Iuqbv.png[/img] [b]Детали изображения:[/b] Высота приложения составляет 150 пикселей, и я пытаюсь переместить значки ниже этого приложения.< /p> Можно ли этого добиться это? Подробнее здесь: [url]https://stackoverflow.com/questions/79280626/how-to-move-desktop-icons-grid-from-top-150-pixel-below[/url]