Nano Hash - криптовалюты, майнинг, программирование

Рисование на фоне рабочего стола (WIN32)

Есть ли способ рисовать на фоне рабочего стола в WIN32, а также получать уведомления, когда фон рабочего стола перекрашивается?

Я пробовал это:

desk = GetDesktopWindow();
dc = GetDC(desk);
MoveToEx(dc,0,0,NULL);
LineTo(dc,1680,1050);
ReleaseDC(desk,dc);

Но рисует на весь экран, даже по окнам, которые на экране.

24.07.2009

Ответы:


1

Вы можете использовать Spy++, чтобы определить, какое окно является фоновым окном рабочего стола.

В моей системе я вижу следующую иерархию:

  • Window 000100098 "Program Manager" Progman
    • Window 0001009E "" SHELLDLL_DefView
      • Window 00100A0 "FolderView" SysListView32

Я думаю, вы имеете в виду SysListView32 — окно со всеми значками. Вы можете использовать FindWindowEx, чтобы найти это окно.

Редактировать Следует использовать комбинацию FindWindowEx и EnumerateChildWindows. Представленный ниже код можно скомпилировать в поле командной строки следующим образом: cl /EHsc finddesktop.cpp /DUNICODE /link user32.lib

#include <windows.h>
#include <iostream>
#include <string>

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
  std::wstring windowClass;
  windowClass.resize(255);

  unsigned int chars = ::RealGetWindowClass(hwnd, &*windowClass.begin(), windowClass.size());
  windowClass.resize(chars);

  if (windowClass == L"SysListView32")
  {
    HWND* folderView = reinterpret_cast<HWND*>(lParam);
    *folderView = hwnd;

    return FALSE;
  }

  return TRUE;
}

int wmain()
{
  HWND parentFolderView = ::FindWindowEx(0, 0, L"Progman", L"Program Manager");
  if (parentFolderView == 0)
  {
    std::wcout << L"Couldn't find Progman window, error: 0x" << std::hex << GetLastError() << std::endl;
  }

  HWND folderView = 0;
  ::EnumChildWindows(parentFolderView, EnumChildProc, reinterpret_cast<LPARAM>(&folderView));

  if (folderView == 0)
  {
    std::wcout << L"Couldn't find FolderView window, error: 0x" << std::hex << GetLastError() << std::endl;
  }
  HWND desktopWindow = ::GetDesktopWindow();

  std::wcout << L"Folder View: " << folderView << std::endl;
  std::wcout << L"Desktop Window: " << desktopWindow << std::endl;

  return 0;
}

Вот результаты после запуска finddesktop.exe

Folder View: 000100A0
Desktop Window: 00010014

Как видите, оконные ручки совсем другие.

24.07.2009
  • Я изменяю первую строку на desk = FindWindowEx(NULL,NULL,LSysListView32,NULL); но я думаю, что он получает то же окно, что и GetDesktopWindow, поскольку имеет тот же эффект. 24.07.2009

  • 2

    Просто цитирую MSDN:

    Функция GetDesktopWindow возвращает дескриптор окна рабочего стола. Окно рабочего стола занимает весь экран. Окно рабочего стола — это область, поверх которой рисуются другие окна.

    Таким образом, вы получаете окно с вложенными окнами. Я не совсем пользователь WIN32, но я думаю, что подход здесь заключается в том, чтобы перейти на более низкий уровень, взять под контроль графический объект, рисующий фоновое изображение, и рисовать там.

    24.07.2009
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..