2016-05-23 6 views
-1

Я пытался нарисовать любую вещь на окно рабочего стола с помощью GetDC(GetDesktopWindow), как следующий простой программы:Не удалось привлечь на DesktopWindow

#include <windows.h> 

int main() 
{ 
    TextOut(GetDC(GetDesktopWindow()), 10, 10, TEXT("Test TextOut Tester!!"), 21); 
    return 0; 
} 

Это кажется, что мои текущие привилегии пользователя влияют на поведение рисования, я не admin на моем ПК, это причина для этого? есть ли какая-либо документация по этой проблеме? Заранее спасибо

+1

Проблема в том, что окно рабочего стола не принадлежит вам. Нет контрактной документации, которая указывает, что это поддерживаемый сценарий. GDI не регулируется привилегиями. То, что вы делаете, терпит неудачу по другой причине. Полное отсутствие обработки ошибок не будет полезно для выяснения. – IInspectable

+0

Что мне делать? если я попытаюсь создать «TextOut» в созданном окне, это будет успешным, но это не удастся, если вы сделаете это на рабочем столе, так что в чем проблема? даже если возвращаемое значение из 'GetDC' и' GetDesktopWindow' не равно нулю. –

+1

Выполнение этого трудно сделать, не является постоянным между перерисовками и 99,9% времени страшной идеей с лучшими альтернативами (вы должны указать конечную цель). Окно GetDesktopWindow() не является окном, которое вы видите, которое содержит значки, обои и т. Д., То есть syslistview, который вам нужно найти, начиная с GetShellWindow(). –

ответ

1

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

DC, который вы получите, когда вы позвоните GetDC(GetDesktopWindow()), будет таким образом полностью обрезанным.

Если вы хотите нарисовать непосредственно на дисплее, то GetDC(NULL) предоставит вам DC, который вы можете использовать для рисования по всему рабочему столу и видимым окнам. Но это, как уже упоминалось, будет полностью работать за пределами передислокационной логики Windows, и результаты будут, ну, уродливыми и непригодными для какой-либо реальной цели (кроме, скажем, получения какой-то отладочной обратной связи из приложения без окон, которое вы в процессе разработки).

Большинство приложений, которые хотят, «отображают что-то на рабочем столе», делают это, создавая окно и рисуя на нем. Почему это не подходит?

+0

Спасибо, 'GetDC (NULL)' работал успешно, и я нарисовал на экране напрямую. –

-1

Это то, что вы должны сделать:

HDC hdc = ::GetDC(NULL); 

//draw on the desktop using the hdc 

::ReleaseDC(NULL, hdc); 
+0

Нет, не делайте этого. Он будет удален только в следующем цикле краски. И это не твое окно. –

+0

Спасибо, он работает с 'GetDC (NULL)'. –

+0

Меня поражает тот факт, что вы дали мне отрицательный рейтинг в конце концов !!! Иногда очень желательно рисовать так: особенно при рисовании с использованием :: SetROP2 с растровой операцией R2_XORPEN на рабочем столе. Дело в том, что так оно и было, никто не спросил, почему это нужно сделать! Это позор. – AlphaP8

 Смежные вопросы

  • Нет связанных вопросов^_^