Чтобы начать работу, я использовал эти две статьи:
Манипулирование значками на рабочем столе — как получить дескриптор SysListView32, когда включены темы с вращением изображений
Получение текста ярлыков на рабочем столе для всех окон
Используя FindWindow, FindWindowEx и SendMessage, мне удалось успешно определить количество значков на рабочем столе (да, действительно 115

Проблема в том, что VirtualAllocEx всегда возвращает значение 0.
Согласно VirtualAllocEx — возвращаемое значение, память адрес должен быть возвращен, если функция завершилась успешно:
Если функция завершилась успешно, возвращаемым значением является базовый адрес выделенной области страниц. Если функция завершается неудачно, возвращаемое значение равно NULL.
GetLastError не возвращает ошибку.
Я читал на различных веб-сайтах, что обработка управления памятью изменилась со времен Windows Vista и что некоторые параметры доступа уже не так просты в использовании. .
Может ли это быть причиной?
Большое спасибо за помощь
Йоланда
Системная среда
- Windows 10 22H2
- Визуальная Studio 17.11.4 (C#-Tools 4.11.0)
- .NET 8.0
using System.Runtime.InteropServices;
namespace DesktopIcon
{
partial class DesktopIcon
{
internal const int LVM_GETITEMCOUNT = 0x00001000 + 4;
internal const int LVIF_TEXT = 0x00000001;
internal const int PROCESS_VM_OPERATION = 0x00000008;
internal const int PROCESS_VM_READ = 0x00000010;
internal const int PROCESS_VM_WRITE = 0x00000020;
internal const int MEM_RESERVE = 0x00002000;
internal const int MEM_COMMIT = 0x00001000;
internal const int PAGE_READWRITE = 0x00001000;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern uint GetLastError();
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern void SetLastError(uint dwErrorCode);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.DLL", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr OpenProcess(uint processAccess, bool bInheritHandle, uint processId);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
static void Main(string[] args)
{
GetDesktopIcons();
}
public static void GetDesktopIcons()
{
// Reset last error
SetLastError(0);
// This buffer size will be enough.
const int BUFFER_SIZE = 0x110;
uint vProcessId = 0;
try
{
// Find window handles via process names.
IntPtr vHandle = FindWindow("Progman", "Program Manager");
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", "FolderView");
Console.WriteLine($"vHandle: {vHandle}");
// Count subwindows of desktop => count of icons.
int vIconCount = SendMessage(vHandle, LVM_GETITEMCOUNT, 0, 0);
Console.WriteLine($"Count desktop icons (vIconCount): {vIconCount}");
// Get the desktop window's process to enumerate child windows.
int threadProcessId = GetWindowThreadProcessId(vHandle, out vProcessId);
Console.WriteLine($"ThreadProcessId: {threadProcessId}");
IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, vProcessId);
Console.WriteLine($"vProcess: {vProcess}");
// Allocate memory in the desktop process.
IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, BUFFER_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
Console.WriteLine($"vPointer: {vPointer}");
}
catch (Exception)
{
throw;
}
Console.WriteLine($"GetLastError: {GetLastError()}");
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... se-address