0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 12

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

12.10.2011, 14:02. Показов 1516. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,867
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,867
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,867
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,867
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru