![]() |
[C++] Как программно обновить содержимое окна
Доброго здоровья всем. Собственно заинтересовался вопросом, возможно ли в С++ программно обновлять окно, не форму приложения. К примеру, выполняется программа, и нужно сделать так чтобы во время выхода она обновляла содержимое окна, папки. Как будто бы была дана команда ПКМ -> обновить или нажата клавиша F5. Как сделать, я не знаю совсем... :dont-know
Вопрос появился в связи с этой темой - Изменение в контекстном меню проводника |
Drongo, воспользуемся вариантом с эмуляцией клавиатурного нажатия F5.
Что б программно нажать и отпустить F5 нужен следующий код keybd_event(VK_F5, 0, 0, 0); keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0); Что б найти нужное окно, которое требуется обновить, воспользуемся Win32 API функцией FindWindow(), а что б сделать его активным - SetForegroundWindow() Например, отправляем программное нажатие F5 в окно с заголовком "Мой компьютер" Код:
#include <windows.h> |
Admiral, Класс!!! :up: То что нужно и работает отлично. :yes: Задача максимум решена.
А если такой вариант, окно открыто, программа отрабатывает и чтобы сразу после её выхода обновлялось бы активное окно, которое на момент выхода является активным\открытым? Возможно как-то домодернизировать предыдущий код? |
Нужно решить дилемму: что будет запускать функции нажатия и отпускания F5 если приложения нет в памяти?
Два варианта, выполняем выше код в виде отдельной проги запускаем батником или иным способом, когда основная закончила работу пускай мини приложение обновляет окно. Насколько знаю по Делфи в среде от Борланда для формы есть события OnExit, OnDestroy быть может попробовать туда разместить? На чистом АПИ данные события наступают когда приложению посылают сообщения WM_QUIT, WM_DESTROY, WM_CLOSE так что в этом случаи код пробовать нужно размещать в обработчик сообщений. Проблема второго варианта состоит в том что приложение ещё может быть активным, соответственно обновление отправится в это же окно. Как вариант скрывать окно (форму) перед неизбежным выходом проги при событиях указанных выше. |
Admiral, Я видимо не совсем правильно выражаюсь и путаю вас
Цитата:
Я на форму кинул компонент Timer, в событии onTimer поставил такой код. Имеет он право на существование в таком виде? По сути, если его поставить перед Close();. Код:
... |
Drongo ну почему же, это был бы оптимальным вариантом, если б окно обновлялось как раз именно после выгрузки программы из памяти, что б было в виде "пост инструкций". Кстати так происходит после выхода из 3d игр, но там это больше связанно с реакцией Эксплорера на переключение видеорежима.
А что касается в момент выхода, то там как раз те сложности про которые присущи второму варианту, если окно не скрыть то как раз своему же и отправится обновление, ибо функция keybd_event() не знает кому передавать, ибо нет соответственного параметра. Что касается данного кода, то если он отрабатывает возложенные функции то имеет, только вот поиск и выделения окна не совсем то ибо требовалось обновлять активное, а это ведь совсем не обязательно окно "Моего Компьютера". |
Admiral, В первый коммент добавил ссылку на тему побудившую задать вопрос - Изменение в контекстном меню проводника. Вы там ответили примером приведённым Котярой
Цитата:
Цитата:
Цитата:
P.S. Я просто не знаю, как это нужно сделать. Мог бы кто показать? |
http://www.codeproject.com/KB/shell/NSExtAddDelFld.aspx
вот это место: Код:
BOOL CALLBACK RefreshShellView( HWND hWnd, LPARAM lParam ) |
Drongo можно вписать в первый параметр функции WinExec таким вот образом
Код:
char sysbuf[2*MAX_PATH]; В общем, случаи после отработки программы не нужно выделять никаких окон, пуска программа просто пуляет F5, который попадёт в активное окно выделенное пользователём. |
Время: 04:48. |
Время: 04:48.
© OSzone.net 2001-