Меню

Как получить дескриптор рабочего стола



Как получить дескриптор окна рабочего стола?

Windows API предоставляет API GetDesktopWindow (), который возвращает дескриптор окна

Но я протестировал Spy++ и обнаружил, что дескриптор окна рабочего стола и дескриптор окна «Рабочий стол Windows» не совпадают.

Поскольку «Рабочий стол Windows» является представлением списка, мне нужно сделать следующее

Получив дескриптор Window, я хочу использовать SendMessage() для таких операций, как получение выбранного имени файла, количества выбранных файлов и т. Д.

Пожалуйста, выскажите свое мнение. Я делаю это с помощью Windows SDK

2 ответа

В свете недавней дискуссии о том, что Мета жаловалась на то, что подобные вопросы «не получили правильного ответа», я постараюсь дать ответ на этот вопрос. Не подразумевать, что я думаю, что ответ Меклариана плохой — фактически из этого. Но это явно было признано неудовлетворительным, поэтому, возможно, я смогу заполнить некоторые дополнительные детали.

Ваша проблема возникает из-за довольно распространенного заблуждения по поводу того, что представляет собой окно рабочего стола. GetDesktopWindow Функция делает именно то, что задокументировано: она возвращает дескриптор окна рабочего стола. Это, однако, не то же самое окно, которое содержит значки на рабочем столе. Это совершенно другое окно, которое впервые появилось в Windows 95. Это на самом деле ListView для элемента управления установлено представление «Большие значки» с фактическим окном рабочего стола в качестве его родителя.

Раймонд Чен (Raymond Chen), разработчик команды Windows Shell, предоставляет некоторые дополнительные подробности в следующей конфиденциальной статье Windows: остатки от Windows 3.0

[ . , , ] Если в Windows 3.0 значки на рабочем столе представляли свернутые окна, то в Windows 95 рабочий стол выполнял роль контейнера для значков.

Рабочий стол Windows 95 был фактически окном, созданным Проводником, который закрывал ваш экран (но находился под всеми остальными окнами на вашем рабочем столе). Это было окно, в котором отображались ваши иконки. Под этим все еще было окно рабочего стола оконного менеджера (окно, которое вы получаете, если вы вызываете GetDesktopWindow), но вы никогда не видели его, потому что оно было закрыто рабочим столом Windows 95 — так же, как деревянные панели в подвале дома моего коллеги покрыл оригинальную стену и капсулу времени за стеной.

Этот дизайн рабочего стола практически не изменился с момента его появления в Windows 95. На обычном компьютере оригинальный рабочий стол все еще там, но он полностью покрыт рабочим столом Explorer.

В итоге, окно, возвращаемое GetDesktopWindow Функция — это фактическое окно рабочего стола, единственное, что у нас было в Windows 3.0. Рабочий стол Explorer (тот, который содержит все ваши значки) — это просто другое окно, расположенное в верхней части окна рабочего стола (хотя и полностью закрывающее оригинал), которое не было добавлено до Windows 95.

Если вы хотите получить дескриптор окна рабочего стола Explorer, вам нужно проделать дополнительную работу, помимо простого вызова GetDesktopWindow функция. В частности, вам нужно пройти по дочерним окнам фактического окна рабочего стола, чтобы найти то, которое Explorer использует для отображения значков. Сделайте это, позвонив FindWindowEx Функция, чтобы получить каждое окно в иерархии, пока вы не получите то, что вы хотите. У него есть имя класса SysListView32 , Вы также, вероятно, захотите использовать GetShellWindow функция, которая возвращает дескриптор окна рабочего стола оболочки, чтобы помочь вам начать работу.

Код может выглядеть следующим образом (предупреждение: этот код не проверен, и я не рекомендую его использовать в любом случае!):

Я отметил, что на самом деле я не рекомендую использовать этот код. Почему бы и нет? Потому что почти в каждом случае, когда вы хотите получить дескриптор окна рабочего стола (либо фактического окна рабочего стола, либо рабочего стола Проводника), вы делаете что-то не так.

Это не то, как вы должны взаимодействовать с окном рабочего стола. На самом деле, вы вообще не должны с этим взаимодействовать! Помните, как вы узнали в детстве, что нельзя играть с вещами, принадлежащими другим людям, без их разрешения? Что ж, рабочий стол принадлежит Windows (точнее, Shell), и он не дал вам разрешения играть с его игрушками! И, как и любой хороший ребенок, «Шелл» подвержен раздражению, когда вы пытаетесь поиграть со своими игрушками, не спрашивая.

Тот же Рэймонд Чен опубликовал в своем блоге еще одну статью, в которой подробно описан конкретный случай под названием » Что такого особенного в окне рабочего стола?

Читайте также:  Как делать столы своими руками кухонные

Помимо приведенного им примера, это принципиально не способ автоматизации пользовательского интерфейса. Это просто слишком хрупко, слишком проблематично и слишком подвержено взлому в будущих версиях Windows. Вместо этого определите, что именно вы на самом деле пытаетесь выполнить, а затем найдите функцию, которая позволяет вам это сделать.

Если такой функции не существует, урок, который нужно извлечь, заключается не в том, что Microsoft просто хочет усложнить жизнь разработчикам. Скорее, вы не должны делать это в первую очередь.

Источник

11.5 Дескриптор рабочего стола стр.1

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Имеется функция GetDesktopWindow, позволяющая получить дескриптор окна рабочего стола. Она объявлена в модуле Windows следующим образом:

Полученный с помощью этой функции дескриптор можно далее использовать в любых функциях API Windows. Если вы хотите что-то рисовать или писать непосредственно на поверхности рабочего стола, то предварительно надо получить дескриптор его контекста. Получение дескриптора контекста обеспечивает функция GetWindowDC:

А далее для вывода текста вы можете использовать такие функции API Windows, как DrawText, DrawTextEx, ExtTextOut, ExtTextOut, TabbedTextOut.

Для рисования фигур вы также можете использовать целый ряд функций API Windows. Ниже приведен пример, демонстрирующий вывод текста и изображения на рабочий стол:

Дескриптор контекста рабочего стола HD получен функцией GetWindowDC, в которую в качестве аргумента передан дескриптор окна рабочего стола, возвращаемый функцией GetDesktopWindow. Переменная S содержит выводимый текст, а запись R определяет область, в которую этот текст выводится. Эта область очищается функцией FillRect, в которую в качестве кисти передается кисть, возвращаемая функцией GetStockObject с аргументом WHITE__BRUSH. Функция GetStock-Object возвращает дескриптор одного из предопределенных в Windows инструментов, используемых для изображений: пера, кисти, шрифта. В данном случае для заполнения области требуется кисть. Константа WHITE_BRUSH определяет кисть белого цвета. Посмотрите в справке другие возможные варианты.

Текст в данном примере выводится функцией DrawText. В числе ее флагов заданы DT_CENTER — выравнивание по центру области, и DT_WORDBREAK — перенос длинных текстов на несколько строк. Следующий оператор вызывает функцию Ellipse, рисующую круг. Это сделано просто для демонстрации возможностей рисования. Последний оператор приведенного кода освобождает дескриптор контекста окна рабочего стола.

Приведенный код рассчитан на использование VCL Win32. В приложении VCL .NET он должен быть немного изменен:

Первое изменение связано с тем, что без ссылки на пространство имен Borland.Vcl.Types компилятор не найдет функцию Rect. А второе изменение связано с тем, что в VCL .NET функция DrawText принимает не указатель на строку текста, а саму строку.

Если вы реализуете подобные примеры, то увидите, что текст и круг будут нарисованы на поверхности стола. Впрочем, рисование произойдет именно на поверхности стола, если указанная в коде область не закрыта какими-то окнами. А если она закрыта, то текст и фигура будут выведены прямо поверх окна верхнего уровня.

В данном случае для рисования использовались перо, кисть, и шрифт, установленные в Windows. Вы можете изменять эти установки. Например, если в приведенном выше коде вы вставите объявление еще двух переменных:

Pen, PenPrev: HPEN; а перед рисованием круга выполните операторы

то граница круга будет нарисована красной толстой линией. Первый из приведенный операторов создает функцией CreatePen новое перо и задает его характеристики: сплошная линия красного цвета с толщиной 4. Второй оператор активизирует функцией SelectObject это перо и заносит в переменную PenPrev ранее использовавшееся перо. Если вы затем захотите восстановить прежнее перо, то сможете сделать это оператором

При рисовании и выводе текста рассмотренными способами надо иметь в виду, что ваше изображение исчезнет при любой перерисовке окна.

Источник

Как нарисовать что-либо на рабочем столе

И снова приветсвую всех, у меня родилась эта идея вспонтанно, но очень заинтерисовала, ибо не так скучна как обыденные лабы с программирования(хотя доля интереса в них присуцтвует)

Хочу выводить на рабочем столе что-нибудь: линии, графики, изображения, может быть какие-то компоненты кинуть(если таково возможно), тоесть использовать рабочий стол как «форму», чтоли.

Я не прошу готовых исходных кодов, прошу помощи в поиске информации по данной теме.

Программы не запускаются на рабочем столе, ко всем ярлыкам на рабочем столе добавляется приставка .Ink
Помогите пожалуйста, использовал рекомендованную вами программу CureIT (нашел 18 вредоносных.

Что за папка появляется произвольно на рабочем столе?
Что за папка появляется произвольно на рабочем столе?. После удаления появляется только при.

Читайте также:  Круглый стол как сказать ребенку нет

Ярлыки на рабочем столе. 3 клика что бы открыть
Если у меня активно любое окно (например калькулятор), и я хочу открыть любой ярлык на рабочем.

После перезагрузки пропадает все что есть на рабочем столе!
Здравствуйте,я знаю что уже есть данная тема,прошу тапками в меня не кидать! Перечитал,все форумы.

Решение

Вроде как можно через интероп

Radzhab, ну это же наброски кода. Они и не будут работать, если их тупо «куда-нибудь» вставить.

Импорт библиотек идет в область класса, все остальное должно быть в каком-нибудь методе.

Источник

Как получить дескриптор окна рабочего стола?

Windows API предоставляет API GetDesktopWindow( ) , который возвращает дескриптор окна

Но я проверил с помощью Spy++ и обнаружил, что дескриптор окна рабочего стола и дескриптор окна «Windows Desktop»-это не одно и то же.

Поскольку «Windows Desktop» — это представление списка, нужно ли мне сделать следующее

Как только я получу дескриптор окна, я хочу использовать SendMessage() для таких операций, как получение выбранного имени файла , количества выбранных файлов и т. д.

Пожалуйста, выскажите свое мнение. Я делаю это с помощью Windows SDk

2 ответа

есть программное обеспечение, которое вызывает метод в моем C# dll. В этом методе dll мне нужно иметь дескриптор окна программы/окна, которое называется my dll. как получить этот вызывающий дескриптор окна? Спасибо!

Я хотел бы сделать какой-то пользовательский рисунок на моем рабочем столе windows таким образом, чтобы он заменял фон рабочего стола (обои). Моя первая попытка состояла в том, чтобы получить DC для desktopListView и привлечь к нему: IntPtr desktopDC = GetWindowDC(desktopListView); Graphics g =.

В свете недавнего обсуждения мета -жалоб на то, что вопросы, подобные этому, «не были должным образом ответены», я попытаюсь дать ответ на этот вопрос. Не говоря уже о том, что я считаю ответ меклариана плохим—на самом деле, от него. Но это явно было сочтено неудовлетворительным, так что, возможно, я смогу заполнить некоторые дополнительные детали.

Ваша проблема возникает из-за довольно распространенного заблуждения относительно того, что такое окно рабочего стола на самом деле. Функция GetDesktopWindow делает именно то, что она задокументирована: она возвращает дескриптор в окно рабочего стола. Однако это не то же самое окно, которое содержит значки рабочего стола . Это совершенно другое окно, которое появилось впервые в Windows 95. На самом деле это элемент управления ListView , установленный в представление «Large Icons», с фактическим окном рабочего стола в качестве его родителя.

Рэймонд Чен, разработчик из команды Windows Shell, приводит некоторые дополнительные подробности в следующей конфиденциальной статье Windows: остатки от Windows 3.0

[ . . . ] в то время как в Windows 3.0 значки на рабочем столе представляли собой свернутый windows, в Windows 95 рабочий стол действовал как контейнер значков.

Рабочий стол Windows 95 на самом деле был окном, созданным Explorer, которое закрывало ваш экран (но сидело под всеми другими windows на вашем рабочем столе). Это было окно, в котором отображались ваши значки. Под ним все еще было окно рабочего стола менеджера окон (окно, которое вы получаете, если называете GetDesktopWindow), но вы никогда не видели его, потому что оно было покрыто рабочим столом Windows 95—так же, как деревянные панели в подвале дома моего коллеги покрывали оригинальную стену и капсулу времени за стеной.

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

Таким образом, окно, возвращаемое функцией GetDesktopWindow , является фактическим окном рабочего стола, единственным, которое мы имели в прошлом в Windows 3.0. Рабочий стол Explorer (тот, который содержит все ваши значки) — это просто еще одно окно, расположенное поверх окна рабочего стола (хотя и полностью закрывающее оригинал), которое не было добавлено до Windows 95.

Если вы хотите получить дескриптор окна рабочего стола Explorer, вам нужно выполнить дополнительную работу, помимо простого вызова функции GetDesktopWindow . В частности, вам нужно пройти по дочернему windows фактическому окну рабочего стола, чтобы найти то, которое Explorer использует для отображения значков. Сделайте это, вызвав функцию FindWindowEx , чтобы получить каждое окно в иерархии, пока вы не доберетесь до нужного вам окна. Он имеет имя класса SysListView32 . Вы также, вероятно, захотите использовать функцию GetShellWindow , которая возвращает дескриптор в окно рабочего стола Shell, чтобы помочь вам начать работу.

Читайте также:  Как быстро все свернуть с рабочего стола

Код может выглядеть следующим образом (внимание: этот код непроверен, и я все равно не рекомендую его использовать!):

Я заметил там, что на самом деле не рекомендую использовать этот код. А почему бы и нет? Потому что почти в каждом случае, когда вы хотите получить дескриптор окна рабочего стола (либо фактического окна рабочего стола, либо рабочего стола Explorer), вы делаете что-то неправильно.

Это не то, как вы должны взаимодействовать с окном рабочего стола. На самом деле, вы вообще не должны с ним взаимодействовать! Помните, как вы учились в детстве, что нельзя играть с вещами, принадлежащими другим людям, без их разрешения? Ну, рабочий стол принадлежит Windows (точнее, к Shell), и он не дал вам разрешения играть со своими игрушками! И как любой хороший ребенок, Shell подвержен истерике, когда вы пытаетесь играть с его игрушками, не спрашивая.

Тот же Раймонд Чен опубликовал в своем блоге еще одну статью, в которой подробно описан очень специфический случай, озаглавленный » что такого особенного в окне рабочего стола?

Помимо примера, который он приводит,это принципиально не способ сделать UI автоматизации. Он просто слишком хрупок, слишком проблематичен и слишком подвержен разрушению в будущих версиях Windows. Вместо этого определите, что именно вы на самом деле пытаетесь выполнить, а затем найдите функцию, которая позволяет вам это сделать.

Если такой функции не существует, то урок, который следует извлечь, заключается не в том, что Microsoft просто хочет усложнить жизнь разработчикам. Но скорее то, что вы не должны делать этого в первую очередь.

Если вы хотите, чтобы окно рабочего стола было определено в GetDesktopWindow(), используйте этот дескриптор окна. Это дескриптор окна, который вы должны использовать для поиска верхнего уровня windows и других связанных с ним действий.

То, что вы видите в Spy++ — это просто контент, нарисованный как рабочий стол в вашей сессии. Если вы используете функцию автоматического поиска в Spy++, вы увидите, что SysListView32-объявленное окно является дочерним окном вашего explorer shell. Довольно редко кому-то требуется доступ к этому окну. Кроме того, существование этого окна может быть подвержено изменениям между версиями windows.

Редактирование (дополнительная информация)

Если вы хотите взаимодействовать или размещать вещи на фактическом рабочем столе shell, вы можете быть лучше обслуживаемы другими APIs. Вот два таких APIs, которые могут выполнить это, в зависимости от целевой версии windows.

Использование активного рабочего стола @ MSDN
Это доступно на Windows 2000 и XP, хотя часто отключается пользователями и системными администраторами.

Похожие вопросы:

Используя C++, как я могу получить дескриптор окна рабочего стола на Mac OS X?

Я нашел функцию рабочего стола по умолчанию GetDesktopWindow функция Что как поймать результат для второго монитора? * РЕДАКТИРОВАТЬ РЕШЕНО *

Я написал некоторый код, чтобы определить, находится ли определенное окно внутри границ рабочего стола. Так или иначе, это не работает. Для каждого окна, независимо от того, находится ли оно внутри.

есть программное обеспечение, которое вызывает метод в моем C# dll. В этом методе dll мне нужно иметь дескриптор окна программы/окна, которое называется my dll. как получить этот вызывающий.

Я хотел бы сделать какой-то пользовательский рисунок на моем рабочем столе windows таким образом, чтобы он заменял фон рабочего стола (обои). Моя первая попытка состояла в том, чтобы получить DC для.

Я могу получить дескриптор окна по заголовку с помощью FindWindow, но если окно свернуто, я не могу получить дескриптор окна. Как вы получаете дескриптор к свернутому окну? hWindow :=.

Я использую MSAA для некоторой автоматизации. В отличие от всех других элементов MSAA я не могу перебирать дочерние элементы окна рабочего стола (хотя я могу получить количество windows с.

Цель Получение координат рабочего стола рабочего стола item/icon. Попытка Я получил дескриптор окна SysListView32, который содержит значки рабочего стола с помощью: HWND hWnd_Progman =.

Я пытаюсь получить границы окна рабочего стола с помощью applescript со следующим кодом: tell application Finder get bounds of window of desktop end tell Я продолжаю получать ошибка выполнения.

В одной из моих программ мне нужно проверить, если пользователь в данный момент фокусирует окно desktop/shell. В настоящее время я использую GetShellWindow() из user32.dll и сравниваю результат с.

Источник

Adblock
detector