Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hook on closing program 
:(
    Опции темы
tusha
Дата 14.8.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



необходимо запретить юзеру закрывать программу путем нажатия на крестик (варианты alt+f4, taskmanager можно не учитывать) . както давно надыбал на Винграде тему где описывается создание простейшего клавиатурного шпиона через хуки. во тчто слепил. прошу не пинать сильно (все мы когдато учились  smile )
DLL
Код

HHOOK hhk;

LRESULT CALLBACK PreventClose(int code,WPARAM wParam,LPARAM lParam);
extern "C" __declspec(dllexport) bool SetHook(wchar_t *windowclassname, bool state);

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

bool SetHook(wchar_t *windowclassname, bool state)
{
    HWND hWnd = FindWindowEx(NULL,NULL,windowclassname,NULL);
    if (hWnd==NULL)
        return false;

    if (state)
    {
        hhk=SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)PreventClose, (HINSTANCE)hWnd, 0);
        if (!hhk)
            return false;
        return true;
    }
    else
    {
        UnhookWindowsHookEx(hhk);
        return true;
    }    
}

LRESULT CALLBACK PreventClose(int code,WPARAM wParam,LPARAM lParam)
{ 
    if(code==HC_ACTION)
    {
        if (((CWPSTRUCT *)lParam)->message==WM_CLOSE)
            MessageBoxEx(NULL,L"Unable to close application",L"ACHTUNG!",MB_ICONERROR,0);
    }
    return CallNextHookEx(hhk,code,wParam,lParam); }



MAIN
Код

#include "stdafx.h"
#include <iostream>
#include <WINDOWS.H>

extern "C" __declspec(dllimport) bool SetHook(wchar_t *winclassname, bool _s);
using namespace std;

typedef
bool (*SETHOOK)(bool);

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t _n[]=L"Notepad";

    HINSTANCE hDll;
    hDll = LoadLibrary(L"hooking.dll");
    if(!hDll)return 0;
    MSG msg;
    
    SETHOOK sh;
    sh = (SETHOOK)GetProcAddress(hDll,"SetHook");
    cout << SetHook(_n,true);
    
    if(sh)
        sh(true);
    
    while(GetMessage(&msg,0,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    if(sh)
        sh(false);

    return 0;
}


=) вот что вышло. вобщем нифига не получается., блокнот как закрывался так и закрывается, никаких изменений.
меня смущают 1 и 3 параметры SetWindowsHookEx - правильный ли я ставлю фильтр? и как подвязать фильтр к конктретной программе? - в данном случае Notepad
натолкните на правильную мысль
буду благодарен за советы)
PM MAIL   Вверх
GoldFinch
Дата 14.8.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



при WM_CLOSE
return 0;

Добавлено через 1 минуту и 4 секунды
найди нужное место в целевой проге и пропатчи его
PM MAIL ICQ   Вверх
tusha
Дата 17.8.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



не, чет не получается....  smile 
при данном коде, даже хук не получаетсяя поставить. - 
Код

hhk=SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)PreventClose, (HINSTANCE)hWnd, 0);

всегда NULL

если сделать так:
Код

HINSTANCE hInst;
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    hInst=(HINSTANCE)hModule;
    return TRUE;
}
............................................................................................
hhk=SetWindowsHookEx(WH_MSGFILTER, (HOOKPROC)PreventClose, hInst,0);

хук типа ставится.. - но не понятно куда))) 

отработка же 
Код

if (((MSG *)lParam)->message==WM_CLOSE)
        {
            //MessageBoxEx(NULL,L"Unable to close application",L"ACHTUNG!",MB_ICONERROR,0);
            return 0;
        }
 по прежнему не происходит..... 
мож фильтр не правильный?
PM MAIL   Вверх
Cheloveck
Дата 17.8.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Код

LRESULT CALLBACK WndProc(HWND hWnd,UINT Message, UINT wParam, LONG lParam)
{
    switch(Message)
    {
    case WM_CLOSE:
        return 0;
//.........................................
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}

Зачем хуки?


--------------------
user posted image
PM Jabber   Вверх
tusha
Дата 17.8.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



хм, прикол в том, что из моей проги мне надо контролировать стороннее приложение (notepad, mspaint к примеру). или я чтото не до конца понимаю.... в каком контексте надо юзать 
Код

LRESULT CALLBACK WndProc(HWND hWnd,UINT Message, UINT wParam, LONG lParam)
{
    switch(Message)
    {
    case WM_CLOSE:
        return 0;
//.........................................
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}

????????
PM MAIL   Вверх
GoldFinch
Дата 17.8.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



tusha, найди в целевой проге место где она обрабатывает сообщения, и при WM_CLOSE возвращай 0
PM MAIL ICQ   Вверх
tusha
Дата 17.8.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



у меня нету исходников проги. только exe)

Добавлено через 6 минут и 47 секунд
вот что получилось на данный момент:
хук устанавливаю так:
Код

hhk=SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)PreventClose, hInst, 0);


обработка сообщений:
Код

if(code==HC_ACTION)
    {        
        if (((PMSG)lParam)->message==SC_CLOSE)        
        {
            MessageBoxEx(NULL,L"Unable to close application",L"ACHTUNG!",MB_ICONERROR,0);
            return 0;
        }
    }
    return CallNextHookEx(hhk,code,wParam,lParam); }

при закрытии блокнота АХТУНГ показыватеся )))) НО блокнот таки закрывается. + аналоггичный мессадж показывается на закрытие всех приложений (получился такой себе глобальный хук)  smile 
PM MAIL   Вверх
GoldFinch
Дата 17.8.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



tusha, реверсируй этот .ехе - получишь "исходники"
для этого можно использовать отладчик, например OllyDbg
PM MAIL ICQ   Вверх
tusha
Дата 17.8.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



гм... мож я не совсем правильно обрисовал задачу (или я не понимаю что до меня хотят донести =) )..
есть прога - не моя, исходников нету, менять ее НЕЛЬЗЯ (лицензия) - которая получает данные с датчиков в режиме онлайн. юзеры иногда вместо того, чтоб свернуть , попадают по крестику - тем самым прерывая получение данных.

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

получить ассемблерный код впринципе можно, а смысл?
PM MAIL   Вверх
GremlinProg
Дата 17.8.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



с первым параметром проблем нет, но вот третий -  да
Цитата(tusha @  15.8.2009,  00:20 Найти цитируемый пост)
(HINSTANCE)hWnd

HINSTANCE != HWND при всем желании
Код

HINSTANCE hInst;
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    hInst = hModule;
    return TRUE;
}

bool SetHook(wchar_t *windowclassname, bool state){
...
 ThreadID = GetWindowThreadProcessId( hWnd, NULL );
 hhk=SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)PreventClose, hInst, ThreadID);
...
}

только твой хук будет срабатывать во всех окнах заданного потока, если в PreventClose не проверять дескриптор


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 17.8.2009, 13:11 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



на самом деле, задача решается так:
Код

#include <Windows.h>

int main()
{
    HWND hwnd=FindWindowW(0,L"Калькулятор");
    SetWindowLongPtr(hwnd,GWL_STYLE,WS_VISIBLE);
    return GetLastError();
}

со стилями надо экспериментировать
PM MAIL ICQ   Вверх
GremlinProg
Дата 17.8.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(GoldFinch @  17.8.2009,  15:11 Найти цитируемый пост)

на самом деле, задача решается так:
Код

#include <Windows.h>

int main()
{
    HWND hwnd=FindWindowW(0,L"Калькулятор");
    SetWindowLongPtr(hwnd,GWL_STYLE,WS_VISIBLE);
    return GetLastError();
}

со стилями надо экспериментировать

да, со стилями надо экспериментировать, только что, по твоему твой код делает?
Цитата(Window Styles @ MSDN)

WS_VISIBLE 
Creates a window that is initially visible.
This style can be turned on and off by using ShowWindow or SetWindowPos.


Добавлено через 4 минуты и 57 секунд
ты просто выключаешь все стили окна, причем закрыть его по прежнему можно: Alt+F4


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 17.8.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



GremlinProg, я тестировал свой код, он делает что надо - убирает крестик (вместе со всей строкой заголовка)
если убрать VS_VISIBLE, окно пропадет насовсем, проверь
 
Цитата(tusha @  14.8.2009,  23:20 Найти цитируемый пост)
(варианты alt+f4, taskmanager можно не учитывать)

избавляться от Alt+F4 ТС не надо
PM MAIL ICQ   Вверх
GremlinProg
Дата 17.8.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(GoldFinch @  17.8.2009,  16:04 Найти цитируемый пост)
я тестировал свой код, он делает что надо - убирает крестик (вместе со всей строкой заголовка)

во первых, убирает не только крестик со строкой заголовка, а все стили,
во вторых, очевидно, это не то решение, которое требуется


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 17.8.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



решение с заменой стиля - именно то которое требуется
надо посмотреть родной стиль окна (например spy++) и изменить его так, чтобы крестик пропал\заблокировался

Добавлено через 5 минут и 46 секунд
вот полностью доделанное решение
Код

#include <Windows.h>

int main()
{
    HWND hwnd=FindWindowW(0,L"Калькулятор");
    LONG_PTR style = GetWindowLongPtr(hwnd,GWL_STYLE);
    style^=WS_SYSMENU;
    SetWindowLongPtr(hwnd,GWL_STYLE,style);
    return GetLastError();
}

убирает все кнопки из строки заголовка, сохраняя все остальные стили
(строка заголовка остается)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.