Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] [C++] Как программно обновить содержимое окна

Ответить
Настройки темы
Win32 API - [решено] [C++] Как программно обновить содержимое окна

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 28-03-2009
Описание: Добавил ссылку на тему, которая побудила задать текущий вопрос
Доброго здоровья всем. Собственно заинтересовался вопросом, возможно ли в С++ программно обновлять окно, не форму приложения. К примеру, выполняется программа, и нужно сделать так чтобы во время выхода она обновляла содержимое окна, папки. Как будто бы была дана команда ПКМ -> обновить или нажата клавиша F5. Как сделать, я не знаю совсем...

Вопрос появился в связи с этой темой - Изменение в контекстном меню проводника

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 21:31, 22-03-2009

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить 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;
}
Это не часть языка С\С++, а вызовы Windows API функций.
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:09, 23-03-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Admiral, Класс!!! То что нужно и работает отлично. Задача максимум решена.

А если такой вариант, окно открыто, программа отрабатывает и чтобы сразу после её выхода обновлялось бы активное окно, которое на момент выхода является активным\открытым? Возможно как-то домодернизировать предыдущий код?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 10:34, 23-03-2009 | #3


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Нужно решить дилемму: что будет запускать функции нажатия и отпускания F5 если приложения нет в памяти?
Два варианта, выполняем выше код в виде отдельной проги запускаем батником или иным способом, когда основная закончила работу пускай мини приложение обновляет окно.
Насколько знаю по Делфи в среде от Борланда для формы есть события OnExit, OnDestroy быть может попробовать туда разместить?
На чистом АПИ данные события наступают когда приложению посылают сообщения WM_QUIT, WM_DESTROY, WM_CLOSE так что в этом случаи код пробовать нужно размещать в обработчик сообщений.

Проблема второго варианта состоит в том что приложение ещё может быть активным, соответственно обновление отправится в это же окно. Как вариант скрывать окно (форму) перед неизбежным выходом проги при событиях указанных выше.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:15, 23-03-2009 | #4


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить 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();
}
...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 11:21, 24-03-2009 | #5


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Drongo ну почему же, это был бы оптимальным вариантом, если б окно обновлялось как раз именно после выгрузки программы из памяти, что б было в виде "пост инструкций". Кстати так происходит после выхода из 3d игр, но там это больше связанно с реакцией Эксплорера на переключение видеорежима.
А что касается в момент выхода, то там как раз те сложности про которые присущи второму варианту, если окно не скрыть то как раз своему же и отправится обновление, ибо функция keybd_event() не знает кому передавать, ибо нет соответственного параметра.
Что касается данного кода, то если он отрабатывает возложенные функции то имеет, только вот поиск и выделения окна не совсем то ибо требовалось обновлять активное, а это ведь совсем не обязательно окно "Моего Компьютера".
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:07, 27-03-2009 | #6


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Admiral, В первый коммент добавил ссылку на тему побудившую задать вопрос - Изменение в контекстном меню проводника. Вы там ответили примером приведённым Котярой
Цитата Admiral:
Обновить можно ещё такой командой,
Цитата Котяра:
%SystemRoot%\System32\RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters >>
, которую можно и в батник. »
Но я не знаю как можно выполнить эту команду из программы, куда её вписать, и как?
Цитата Admiral:
если окно не скрыть то как раз своему же и отправится обновление, ибо функция keybd_event() не знает кому передавать, ибо нет соответственного параметра. »
Тоесть получается, что обновление будет для окна самой программы, правильно?
Цитата Admiral:
Что касается данного кода, то если он отрабатывает возложенные функции то имеет, только вот поиск и выделения окна не совсем то ибо требовалось обновлять активное, а это ведь совсем не обязательно окно "Моего Компьютера". »
Да, это может быть любое открытое окно. Другими словами это сделать невозможно?

P.S. Я просто не знаю, как это нужно сделать. Мог бы кто показать?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 20:30, 28-03-2009 | #7

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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
Благодарности: 916

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] [C++] Как программно обновить содержимое окна

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] убирается галка "Отображать содержимое окна при перетаскивании" 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




 
Переход