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

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

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

Author24 — интернет-сервис помощи студентам
Написал прогу, которая постоянно перебирает все окна и закрывает, если у окна определенный заголовок
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2011, 14:02
Ответы с готовыми решениями:

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

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

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

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

8
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
13.10.2011, 11:47 2
описание "Функция 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  [ТС] 3
Ну так и как их узнать? Окно то еще не создано. Если в фильтер-функции вызвать GetWindowText(), все обвалится. Я проверял.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
13.10.2011, 12:00 4
в 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  [ТС] 5
Я понял так, что должно быть что-то такое:
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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
13.10.2011, 19:30 6
Цитата Сообщение от 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  [ТС] 7
Ну целевое окно то не Блокнот, просто тестить удобно на блокноте. заблокировать нужно другое окно его класс окна довольно странный что-то типа #32772 (Диалоговое окно). Проверка на класс окна результата не давала, поэтому проверяю заголовок.

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

Цитата Сообщение от 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  [ТС] 9
TCHAR buf[50] = TEXT("Безымянный - Блокнот\0"); - Это работает. смотрел с помощью отладчика, правда с фильтр-функцией вообще что-то непонятное. Отладчик не показывает мне что происходит внутри нее, хотя я точно знаю что она вызывается и отрабатывает. С другими CALLBACK-функциями такого не было.
0
14.10.2011, 10:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2011, 10:38
Помогаю со студенческими работами здесь

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

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

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

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

Как получить текущую раскладку клавиатуры для чужого активного окна?
Что нужно передавать в GetKeyboardLayout для того, чтобы получить раскладку активного чужого окна,...

Как подавить появление окна настроек принтера?
Каждый раз, когда запускается команда window.print() на экран выводится окно настроек принтера. ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru