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

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

Сообщение Anonymous »

Существует ли какой-либо метод WinAPI для перемещения сетки значков рабочего стола сверху экрана, например, на 150 пикселей ниже?
Я использую этот код Github для перемещения значков снизу сверху экрана но неработающие значки снова возвращаются в положение по умолчанию:
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>
Можно ли этого добиться это?

Вопрос отредактирован:
Не знаю, почему неясно! Хотя в вопросе четко указано, что я пытаюсь переместить значки на рабочем столе сетку (а не значки на рабочем столе).
Как мы все знаем, на рабочем столе Windows есть ListView (SysListView32), чтобы сохранить его значки на рабочем столе, и я пытаюсь переместить этот ListView (или сетку рабочего стола) из верхней части экрана ниже 150 пикселей. И мое приложение (высота которого составляет 150 пикселей) размещается в верхней части экрана (см. изображение выше).
И я могу получить ListView рабочего стола (SysListView32), используя этот код:
[DllImport("user32.dll")]
public static extern IntPtr GetShellWindow();

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

public static IntPtr GetDesktopWindow(DesktopWindow desktopWindow)
{
IntPtr _ProgMan = GetShellWindow();
IntPtr _SHELLDLL_DefViewParent = _ProgMan;
IntPtr _SHELLDLL_DefView = FindWindowEx(_ProgMan, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr _SysListView32 = FindWindowEx(_SHELLDLL_DefView, IntPtr.Zero, "SysListView32", "FolderView");

if (_SHELLDLL_DefView == IntPtr.Zero)
{
EnumWindows((hwnd, lParam) =>
{
var sb = new StringBuilder(256);
GetClassName(hwnd, sb, sb.Capacity);

if (sb.ToString() == "WorkerW")
{
IntPtr child = FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null);
if (child != IntPtr.Zero)
{
_SHELLDLL_DefViewParent = hwnd;
_SHELLDLL_DefView = child;
_SysListView32 = FindWindowEx(child, IntPtr.Zero, "SysListView32", "FolderView"); ;
return false;
}
}
return true;
}, IntPtr.Zero);
}

switch (desktopWindow)
{
case DesktopWindow.ProgMan:
return _ProgMan;
case DesktopWindow.SHELLDLL_DefViewParent:
return _SHELLDLL_DefViewParent;
case DesktopWindow.SHELLDLL_DefView:
return _SHELLDLL_DefView;
case DesktopWindow.SysListView32:
return _SysListView32;
default:
return IntPtr.Zero;
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... ixel-below
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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