|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] [C++] Как программно обновить содержимое окна |
|
Win32 API - [решено] [C++] Как программно обновить содержимое окна
|
Будем жить, Маэстро... Сообщения: 6694 |
Доброго здоровья всем. Собственно заинтересовался вопросом, возможно ли в С++ программно обновлять окно, не форму приложения. К примеру, выполняется программа, и нужно сделать так чтобы во время выхода она обновляла содержимое окна, папки. Как будто бы была дана команда ПКМ -> обновить или нажата клавиша F5. Как сделать, я не знаю совсем...
![]() Вопрос появился в связи с этой темой - Изменение в контекстном меню проводника |
|
------- Отправлено: 21:31, 22-03-2009 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать 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> int main() { HWND SubjectWindow = FindWindowA(NULL,"Мой компьютер"); //Вместо NULL на первом параметре может быть явно указан класс окна, //в случаи "Моего компьютера" это CabinetWClass. Поможет установить класс API функция GetClassName SetForegroundWindow(SubjectWindow); //в паре с GetForegroundWindow которая указывает на активное окно keybd_event(VK_F5, 0, 0, 0); keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0); return 0; } |
Отправлено: 00:09, 23-03-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Admiral, Класс!!!
![]() ![]() А если такой вариант, окно открыто, программа отрабатывает и чтобы сразу после её выхода обновлялось бы активное окно, которое на момент выхода является активным\открытым? Возможно как-то домодернизировать предыдущий код? |
------- Отправлено: 10:34, 23-03-2009 | #3 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Нужно решить дилемму: что будет запускать функции нажатия и отпускания F5 если приложения нет в памяти?
Два варианта, выполняем выше код в виде отдельной проги запускаем батником или иным способом, когда основная закончила работу пускай мини приложение обновляет окно. Насколько знаю по Делфи в среде от Борланда для формы есть события OnExit, OnDestroy быть может попробовать туда разместить? На чистом АПИ данные события наступают когда приложению посылают сообщения WM_QUIT, WM_DESTROY, WM_CLOSE так что в этом случаи код пробовать нужно размещать в обработчик сообщений. Проблема второго варианта состоит в том что приложение ещё может быть активным, соответственно обновление отправится в это же окно. Как вариант скрывать окно (форму) перед неизбежным выходом проги при событиях указанных выше. |
Отправлено: 23:15, 23-03-2009 | #4 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Admiral, Я видимо не совсем правильно выражаюсь и путаю вас
Цитата Drongo:
Я на форму кинул компонент Timer, в событии onTimer поставил такой код. Имеет он право на существование в таком виде? По сути, если его поставить перед Close();. ... void __fastcall TForm1::tmr1Timer(TObject *Sender) { HWND SubjectWindow = FindWindowA(NULL, "Мой компьютер"); //Вместо NULL на первом параметре может быть явно указан класс окна, //в случаи "Моего компьютера" это CabinetWClass. Поможет установить класс API функция GetClassName SetForegroundWindow(SubjectWindow); //в паре с GetForegroundWindow которая указывает на активное окно keybd_event(VK_F5, 0, 0, 0); keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0); Close(); } ... |
||
------- Отправлено: 11:21, 24-03-2009 | #5 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Drongo ну почему же, это был бы оптимальным вариантом, если б окно обновлялось как раз именно после выгрузки программы из памяти, что б было в виде "пост инструкций". Кстати так происходит после выхода из 3d игр, но там это больше связанно с реакцией Эксплорера на переключение видеорежима.
А что касается в момент выхода, то там как раз те сложности про которые присущи второму варианту, если окно не скрыть то как раз своему же и отправится обновление, ибо функция keybd_event() не знает кому передавать, ибо нет соответственного параметра. Что касается данного кода, то если он отрабатывает возложенные функции то имеет, только вот поиск и выделения окна не совсем то ибо требовалось обновлять активное, а это ведь совсем не обязательно окно "Моего Компьютера". |
Отправлено: 21:07, 27-03-2009 | #6 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Admiral, В первый коммент добавил ссылку на тему побудившую задать вопрос - Изменение в контекстном меню проводника. Вы там ответили примером приведённым Котярой
Цитата Admiral:
Цитата Admiral:
Цитата Admiral:
P.S. Я просто не знаю, как это нужно сделать. Мог бы кто показать? |
||||
------- Отправлено: 20:30, 28-03-2009 | #7 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать http://www.codeproject.com/KB/shell/NSExtAddDelFld.aspx
вот это место: BOOL CALLBACK RefreshShellView( HWND hWnd, LPARAM lParam ) { if( hWnd ) { TCHAR szClassName[MAX_PATH]=_T(""); DWORD dwLen=MAX_PATH; GetClassName(hWnd,szClassName,dwLen); if( (_tcscmp(szClassName,_T("ExploreWClass"))==0) || (_tcscmp(szClassName,_T("CabinetWClass"))==0) ) { HWND hwndShellView = FindWindowEx(hWnd,NULL,_T("NSFViewClass"),NULL); if(hwndShellView !=NULL) { HWND hwndExcept =(HWND)lParam; if((hwndExcept!=NULL && hwndExcept!=hwndShellView) || (hwndExcept==NULL)) ::SendMessage(hwndShellView,WM_COMMAND, ID_VIEW_REFRESH,0); } } } return( TRUE ); } void RefreshShellViewWndsExcept(HWND hwndExcept) { // continue looping until done for(; !EnumWindows((WNDENUMPROC) RefreshShellView, (LPARAM) hwndExcept ); ); } |
Отправлено: 22:31, 28-03-2009 | #8 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Drongo можно вписать в первый параметр функции WinExec таким вот образом
char sysbuf[2*MAX_PATH]; GetSystemDirectoryA(sysbuf,MAX_PATH); //Получаем конкретный путь "%SystemRoot%\System32\" в виде C:\Windows, C:\WinXP, ... strcat(sysbuf,"\\RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1,True"); //дописиваем команду с параметрами WinExec(sysbuf,SW_HIDE); //приводим в исполнение, второй параметр в данном случаи по барабану, ибо данная команда и так не отображает никаких окон В общем, случаи после отработки программы не нужно выделять никаких окон, пуска программа просто пуляет F5, который попадёт в активное окно выделенное пользователём. |
Отправлено: 01:47, 31-03-2009 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - [решено] убирается галка "Отображать содержимое окна при перетаскивании" | Zluk | Microsoft Windows 2000/XP | 31 | 12-02-2015 19:56 | |
как обновить и чем обновить BIOS ASUS P4P800se | Brad | Поиск драйверов, прошивок и руководств | 1 | 30-03-2009 05:05 | |
Разное - [решено] Как лучше всего обновить систему. И стоит ее обновить? | Bester | Microsoft Windows 2000/XP | 7 | 05-01-2008 20:53 | |
проводник не обновляет содержимое окна | Bright | Microsoft Windows 2000/XP | 1 | 28-12-2006 04:31 | |
Как программно определить свой IP | Guest | Сетевые технологии | 3 | 23-06-2004 09:45 |
|