Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 12

Как предотвратиь появление определенного чужого окна

12.10.2011, 14:02. Показов 1510. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал прогу, которая постоянно перебирает все окна и закрывает, если у окна определенный заголовок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam)
{
    if(hWnd)
    {       
        TCHAR buf[255] =  {TCHAR('\0')};
        GetWindowText(hWnd, (LPWSTR)buf, sizeof(buf));
        TCHAR WinText[50] = TEXT("Сообщение о состоянии HP LaserJet M1214nfn MFP_1\0");              
        if(!strcoll((const char*)buf, (const char*)WinText))
        {
            PostMessage(hWnd, WM_CLOSE, NULL, NULL);            
        }
    }
    return true;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    while(true)
    {
        EnumWindows((WNDENUMPROC)EnumProc,NULL);
        Sleep(100);
    }
}
Одна проблема: целевое окно успевает мелькнуть перед тем как закрыться. Есть ли возможность
не дать ему появляться вообще? У меня ощущение, что это можно сделать с помощью хука.
Написал тестовую прогу, которая не дает открывать ни одно окно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<Windows.h>
LRESULT CALLBACK CBTProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode==HCBT_CREATEWND)
    {
        return 1;
    }
    return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    HHOOK hHook;
    while(true)
    {   
        hHook = SetWindowsHookEx(WH_CBT, CBTProc, hInstance, NULL);
        DWORD dwError = GetLastError();     
        if(dwError){return 1, UnhookWindowsHookEx(hHook);}
        Sleep(100);
    }
    UnhookWindowsHookEx(hHook);
    return 0;
}
но как узнать какие-либо параметры окна, которое собирается создать система, например заголовок?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2011, 14:02
Ответы с готовыми решениями:

Появление окна через определенное время или при прокрутке до определенного блока
Подскажите пожалуйста, есть окно, которое должно появляться либо через 5 секунд нахождения на сайте, либо при прокрутке на определенное...

Как отловить появление на странице чужого div с конкретным классом
На мою страницу загружается код со стороннего сайта. Я знаю какой класс будет у div. Нужно отловить момент его появления. То есть в...

Как изменить размер чужого окна?
Нужно создать панель управления размера окна определенного приложения. И еще полноэкранный режим. Можно ли это сделать программно? ...

8
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
13.10.2011, 11:47
описание "Функция CBTProc / Hook / Win32 API"
http://netcode.ru/cpp/?artID=3143
имя и ли класс окна передается в параметрах
WPARAM wParam, LPARAM lParam
не помню точно давно писал
0
0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 12
13.10.2011, 11:53  [ТС]
Ну так и как их узнать? Окно то еще не создано. Если в фильтер-функции вызвать GetWindowText(), все обвалится. Я проверял.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
13.10.2011, 12:00
в lParam
придет структура
CBT_CREATEWND
C++
1
2
3
4
5
typedef struct tagCBT_CREATEWND 
{           
    LPCREATESTRUCT lpcs;
    HWND hwndInsertAfter;
} CBT_CREATEWND;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct tagCREATESTRUCT {  //  cs
 
LPVOID lpCreateParams;
 HINSTANCE hInstance;
 HMENU hMenu;
 HWND hwndParent;
 int cy;
 int cx;
 int y;
 int x;
 LONG style;
 LPCTSTR lpszName;
 LPCTSTR lpszClass;
 DWORD dwExStyle;
 
} CREATESTRUCT, *LPCREATESTRUCT;
LPCTSTR lpszName;
LPCTSTR lpszClass; анализируй
0
0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 12
13.10.2011, 15:46  [ТС]
Я понял так, что должно быть что-то такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<Windows.h>
LRESULT CALLBACK CBTProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode==HCBT_CREATEWND)
    {
        LPCBT_CREATEWND CreateWndParam;     
        CreateWndParam = (LPCBT_CREATEWND)lParam;
        //TCHAR buf[] = TEXT("Сообщение о состоянии HP LaserJet Professional M1214nfh MFP_1");
        TCHAR buf[50] = TEXT("Безымянный - Блокнот\0");        
        if(0==lstrcmp(CreateWndParam->lpcs->lpszName, buf)){return 1;}      
    }
    return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    HHOOK hHook;
    hHook = SetWindowsHookEx(WH_CBT, CBTProc, hInstance, NULL);
    DWORD dwError = GetLastError();
    if(dwError){return 1, UnhookWindowsHookEx(hHook);}
    while(true)
    {       
        Sleep(1000000);
    }
    UnhookWindowsHookEx(hHook);
    return 0;
}
Однако это не работает. В попытках разобраться почему не работает, я заметил, что на фильтр-функцию влияет объявление и инициализация TCHAR buf[50]. В чем на самом деле проблема понять не могу.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
13.10.2011, 19:30
Цитата Сообщение от PodolskyV Посмотреть сообщение
TEXT("Безымянный - Блокнот\0");
0 лишний
строка и так запишет 0 в конце
название может не совпадать
лучше фильтровать по классу окна
или выбери ключевое слово Блокнот и проверяй есть ли оно в названии
может не совпадать ANSII и UNICODE

Цитата Сообщение от PodolskyV Посмотреть сообщение
TCHAR buf[50]
лучше объявить глобально тогда он не будет переопределятся при каждом заходе

Добавлено через 57 секунд
Цитата Сообщение от PodolskyV Посмотреть сообщение
я заметил, что на фильтр-функцию влияет объявление и инициализация TCHAR buf
как влияет
0
0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 12
13.10.2011, 19:37  [ТС]
Ну целевое окно то не Блокнот, просто тестить удобно на блокноте. заблокировать нужно другое окно его класс окна довольно странный что-то типа #32772 (Диалоговое окно). Проверка на класс окна результата не давала, поэтому проверяю заголовок.

Объявление и инициализация TCHAR buf[50] в теле фильтр-функции почему-то приводит к крашу процесса explorer, от чего пропадают все значки на рабочем столе и панель задач. Лечится повторым запуском эксплорера через диспетчер задач, при этом сама моя прога не падает, но может зависнуть.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
13.10.2011, 22:49
я только сейчас заметил

Цитата Сообщение от PodolskyV Посмотреть сообщение
TCHAR buf[50] = TEXT("Безымянный - Блокнот\0");
Цитата Сообщение от PodolskyV Посмотреть сообщение
Объявление и инициализация TCHAR buf[50] в теле фильтр-функции почему-то приводит к крашу процесса explorer,
она и будет падать так строки не инициализируются получишь падения стека(что ты получил) или ошибку доступа
дело в том что память на стеке выделяется в процессе выполнения и как бы должна инициализироватся но у массива нет конструктора копирования (да и быть не может)
ты же не пишешь так
C++
1
2
int b[10];
int a[10]=b;
выход
или
делай буфер глобальным (статическим)тогда он инициализируется при построении и в памяти
будет строка
или
используй функции wsprintf spritf( еще есть не помню)
C++
1
wsprintf (buf,TEXT("Безымянный - Блокнот\0"));
или
используй строки
CString string
или сравнивай с константоной строкой

C++
1
    if(0==lstrcmp(CreateWndParam->lpcs->lpszName, TEXT("Блокнот")))
Добавлено через 3 минуты
и научись пользоватся отладчиком
ты бы сразу увидел что
Цитата Сообщение от PodolskyV Посмотреть сообщение
TCHAR buf[50] = TEXT("Безымянный - Блокнот\0");
не срабатывает

Добавлено через 2 минуты
Цитата Сообщение от PodolskyV Посмотреть сообщение
класс окна довольно странный что-то типа #32772 (Диалоговое окно)
#32772 это и есть класс окна диалога
с 3.0(раньше не работал) не делают символьное определение
0
0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 12
14.10.2011, 10:38  [ТС]
TCHAR buf[50] = TEXT("Безымянный - Блокнот\0"); - Это работает. смотрел с помощью отладчика, правда с фильтр-функцией вообще что-то непонятное. Отладчик не показывает мне что происходит внутри нее, хотя я точно знаю что она вызывается и отрабатывает. С другими CALLBACK-функциями такого не было.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.10.2011, 10:38
Помогаю со студенческими работами здесь

Как мне перехватить перерисовку чужого окна
Вариант погугли не подходит ибо там ничего нету. Мне надо узнать только что окно перерисовалось !

Как узнать хендл чужого окна свёрнутого в трей?
Здравствуйте! Ребята подскажите по такому вопросу можно ли как-нть узнать хендл чужого окна свёрнутого в трей? Если можно, то...

Как добавить свою кнопку в title-bar ЧУЖОГО окна?
Как добавить свою кнопку в title-bar ЧУЖОГО окна? Насколько я понял, полазив по Сети, это непростая задача. Есть примеры добавления...

Как зная дескриптор чужого окна сделать его неактивным?
Подскажите пожалуйста, как зная дескриптор чужого окна сделать его неактивным (невосприимчивым к левым и правым кликам мыши и нажатием...

Как сделать размер чужого окна больше максимального разрешения экрана
Вопрос собственно в заголовке. Вот здесь решается проблема (последнее сообщение) http://**********/q/9278 Только там размер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru