Как после смены обоев обновить рабочий стол?
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\Windows\\лес.bmp",SPIF_UPDATEINIFILE);
// после этого на рабочем столе
// все еще старые обои
// перехожу на рабочий стол жму F5
// для обновления или перезагружаю комп
// и после этого обои изменены...
// Как это сделать программно?
// (т.е. не перезагружая комп)
// Где то находил способ сослаться
// на канву рабочего стола но щас
// не могу откопать этот способ...
// может он бы помог???
// Может Refresh или Redraw какой нибудь?
//Меняю обои
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\Windows\\лес.bmp",SPIF_UPDATEINIFILE);
// после этого на рабочем столе
// все еще старые обои
// перехожу на рабочий стол жму F5
// для обновления или перезагружаю комп
// и после этого обои изменены...
// Как это сделать программно?
// (т.е. не перезагружая комп)
// Где то находил способ сослаться
// на канву рабочего стола но щас
// не могу откопать этот способ...
// может он бы помог???
// Может Refresh или Redraw какой нибудь?
Если знаешь хендл рабочего стола(его узнать легко), то можешь просто послать мессадж WM_PAINT
или
ShellExecute(Application->Handle,
Pchar('Open'),Pchar('C:\Windows\Rundll32.exe'),
Pchar(команда),
Pchar('C:\Windows'),SW_SHOWNORMAL);
"rundll32 user,repaintscreen" - Обновить рабочий стол
Если знаешь хендл рабочего стола(его узнать легко), то можешь просто послать мессадж WM_PAINT
или
ShellExecute(Application->Handle,
Pchar('Open'),Pchar('C:\Windows\Rundll32.exe'),
Pchar(команда),
Pchar('C:\Windows'),SW_SHOWNORMAL);
"rundll32 user,repaintscreen" - Обновить рабочий стол
Сначала даю команду
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, "C:\\Windows\\лес.bmp", SPIF_UPDATEINIFILE);
Потом повторяю при нажатии F5 обновляется рабочий стол и все ок...
НО ПРОГРАМНО... НЕ ПОЛУЧАЕТСЯ :-(
Давал я эту команду rundll32 user,repaintscreen
Стол мигает но новый фон не появляется...
Нашел как определить Handle рабочего стола и даже рисовать на нем...
TCanvas *WCanvas=new TCanvas();
WCanvas->Handle=GetDC(HWND_DESKTOP);
//{Теперь рисуем что хотим и где хотим}
WCanvas->Brush->Color=clRed;
WCanvas->Rectangle(100,100,200,200);
Но даже после этого команда которая я думал поможет не действует :-(((
>>---> WCanvas->Refresh();
Может как ты пишешь можно послать месадж WM_PAINT по данному хэндлу ... :-(( но я понятия не имею какой это командой делается... я попробовал поискать но пока не нашел....
ShellExecute тоже не помогла... хотя может я в нее неправильно подставил команду...
Вобщем вопрос открыт...
Как обновить рабочий стол или как изменить обои рабочего стола что бы сразу был виден результат ...???
Сначала даю команду
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, "C:\\Windows\\лес.bmp", SPIF_UPDATEINIFILE);
Потом повторяю при нажатии F5 обновляется рабочий стол и все ок...
НО ПРОГРАМНО... НЕ ПОЛУЧАЕТСЯ :-(
Давал я эту команду rundll32 user,repaintscreen
Стол мигает но новый фон не появляется...
Нашел как определить Handle рабочего стола и даже рисовать на нем...
TCanvas *WCanvas=new TCanvas();
WCanvas->Handle=GetDC(HWND_DESKTOP);
//{Теперь рисуем что хотим и где хотим}
WCanvas->Brush->Color=clRed;
WCanvas->Rectangle(100,100,200,200);
Но даже после этого команда которая я думал поможет не действует :-(((
>>---> WCanvas->Refresh();
Может как ты пишешь можно послать месадж WM_PAINT по данному хэндлу ... :-(( но я понятия не имею какой это командой делается... я попробовал поискать но пока не нашел....
ShellExecute тоже не помогла... хотя может я в нее неправильно подставил команду...
Вобщем вопрос открыт...
Как обновить рабочий стол или как изменить обои рабочего стола что бы сразу был виден результат ...???
Посылать сообщения:
LRESULT SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
два последних параметра дай NULL
я давал команду
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, "C:\\Windows\\лес.bmp", SPIF_UPDATEINIFILE);
Она выдавала результат не сразу а после перезагрузки или ручного обновления рабочего стола...
Чуть подразобрался и оказалось что если в настройках рабочего стола отключить Active Desctop то в этом случае фон меняется сразу... стал искать как не перезагружая комп отключить Active Desktop ... Предположили что функция SystemParametersInfo должна уметь и это...
Но когда вместе с Дельфином полезли в доки то обнаружили что есть более полный вариант команды для смены рабочего стола...
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, "C:\\Windows\\лес.bmp", (SPIF_SENDWININICHANGE + SPIF_UPDATEINIFILE));
Прекрасно работает и сразу обновляет стол!!!
Уррааа!!!! :D
А чего обновление не сработало..??
Когда выключен АктивДесктоп обновление и не нужно... а когда включен то даже обновление не помагает если дать команду неправильно (Ваш вариант, а через F5 обновляется) ...
Если же правильно
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, "C:\\Windows\\лес.bmp", (SPIF_SENDWININICHANGE + SPIF_UPDATEINIFILE));
То оно и не нужно
:D