Как переместить сетку значков рабочего стола с верхних 150 пикселей внизC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как переместить сетку значков рабочего стола с верхних 150 пикселей вниз

Сообщение Anonymous »

Существует ли какой-либо метод 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»