Julian Reimer Ответов: 1

Могу ли я каким-то образом установить родительский дескриптор" SHELLDLL_DefView " на " WorkerW"


Привет,

При запуске Windows (с помощью Windows 10) порядок окон (по Spy++) выглядит следующим образом:
WorkerW
Progman
   * SHELLDLL_DefView

После нажатия WIN+TAB это выглядит так:
Progman
WorkerW
   * SHELLDLL_DefView

Поскольку моя программа является дочерним элементом SHELLDLL_DefView и становится полупрозрачной после нажатия WIN+TAB, я хочу, чтобы это изменение было сделано для каждого кода, а не внезапно пользователем.

Я попробовал это сделать, но ничего не получилось:
IntPtr progmanHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);
IntPtr shell = FindWindowEx(progmanHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr workerWHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "WorkerW", null);
SetParent(shell, workerWHandle);


Пожалуйста, помогите!
Джулиан

Richard Deeming

Возиться с оконными родителями, особенно на таком низком уровне, почти наверняка неправильно.

Попробуйте объяснить, чего вы на самом деле пытаетесь достичь, и кто-то, вероятно, сможет подсказать вам правильный способ сделать это. :)

Julian Reimer

Я хочу, чтобы моя программа заменила рабочий стол Windows, и именно так поступало большинство людей.

1 Ответов

Рейтинг:
0

Roink

private static IntPtr GetDesktopListView(){
    var hDesktop = IntPtr.Zero;
    var hProgman = W32Api.FindWindow("Progman", "");

    if (hProgman != IntPtr.Zero){
        // hProgman is usable!
        hDesktop = W32Api.FindWindowEx(hProgman, IntPtr.Zero, "SHELLDLL_DefView", 
            IntPtr.Zero);
    }
    if (hDesktop != IntPtr.Zero){
        // hDesktop is usable!
        return W32Api.FindWindowEx(hDesktop, IntPtr.Zero, "SysListView32", 
            IntPtr.Zero);
    }

    // If we reach this point, that means that "SHELLDLL_DefView" is NOT a sibling
    // of "Progman"! Now we gotta spawn "WorkerW" from "Progman" (Windows 7 and beyond)
    // (shhhh... this windows message is NOT DOCUMENTED!)
    const int WmSpawnWorker = 0x052C;
    W32Api.SendMessage(hProgman, WmSpawnWorker, 0, 0);

    hDesktop = W32Api.GetDesktopWindow();
    IntPtr hShellViewWin;
    var hWorkerW = IntPtr.Zero;
    do {
        hWorkerW = W32Api.FindWindowEx(hDesktop, hWorkerW, "WorkerW", IntPtr.Zero);
        hShellViewWin = W32Api.FindWindowEx(hWorkerW, IntPtr.Zero, "SHELLDLL_DefView", 
            IntPtr.Zero);
    } while (hShellViewWin == IntPtr.Zero && hWorkerW != IntPtr.Zero);
    return W32Api.FindWindowEx(hShellViewWin, IntPtr.Zero, "SysListView32",
        IntPtr.Zero);
}