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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка сообщений приложением 
:(
    Опции темы
Zemelya
Дата 12.2.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, господа программисты!
У меня диллема. Поиск удовлетворительных результатов не принес, в силу специфики, на мой взгляд, вопроса.
Начинаю осваивать MS Visual C++, до этого лет 6 писал исключительно на Delphi.
Мне нужно написать приложение, которое не нуждается в форме, но должно получать сообщения из вне.
То есть программа висит (не в смысле зависла smile ), просматривает приходящие сообщения и делает те или иные действия.
нужно что-то вроде этого:
Код

    while (GetMessage(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

только не создавая класс окна и его самого, оно ненужно.
Мне нужно (если это вообще возможно по спецификации) подменить оконную процеду с помощью функции
SetWindowLong(HWND, GWL_WNDPROC, адрес_новой_проц)
вот только, как я понимаю HWND приложения (процесса) мне не получить (он же не окно smile )? Или если можно то как?
Код

    #include "windows.h"

    LRESULT WINAPI WndProc(HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam)
    {
        switch (msg)
        {
            case WM_не_важно:
            {
                same_code;
                break;    
            }
        }
        return 0;
    }

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
        MSG msg;
        SetWindowLong((HWND)hInstance, GWL_WNDPROC, (LONG)WndProc);
        while (GetMessage(&msg, NULL, NULL, NULL))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return 0;
    }

как видно на моем примере, я пытался преобразовать hInstanse приложения в HWND, что подозреваю не совсем правильно, поскольку реакции приложения не последовало, я имею ввиду в WndProc не заходит.
Во-первых потому что застревает на GetMessage ожидая сообщений, которых почему-то нету, во-вторых если заменить ожидающий GetMessage на просматривающий PeekMessage то приложение зацикливается, выгребая все ресурсы камня на себя.

В делфи подобная конструкция работает, только там вместо hInstanse я передавал Application.Handle

На сколько я вообще знаю, то сообщения ведь получает сам процесс, а потом в зависимости от хэндла окна, в которое оно посылалось, процесс пересылает его одному из своих окон, ну если точнее то окно, для которого пришло сообщение само выбирает его из очереди сообщений, если согласно хэндлу оно принадлежит ему. Так ли это на самом деле?

Так вот, подытожу. Ответьте мне пожалуйста на вопрос, может ли приложение получать "оконные сообщения" не имея окон вообще (чет даж звучит странно), и если все таки такое чудо возможно, ткните носом как правильно подменить процедуру. Еще раз повторюсь, что окно создавать мне ненужно, как с окном это все провернуть на С++ я уже знаю smile

M
GremlinProg
Пользуйтесь тегом [соde][/соde], пожалуйста!


Это сообщение отредактировал(а) GremlinProg - 15.2.2011, 09:30
PM MAIL   Вверх
KaraKum
Дата 12.2.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Окна получают специфичные для окон сообщения: "перерисуйся" (когда его сворачивают-разворачивают или двигают поверх него другое окно); "закройся" (когда окно закрывают); "клик мыши"; "нажатие клавиши в момент фокуса окна" и так далее.
А какие сообщения подразумевается получать, не имея, при этом, окна?
Если не нужно создавать окон, то это консольное приложение.
PM MAIL WWW   Вверх
Earnest
Дата 14.2.2011, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Есть специальный тип окон (Message Window, как-то так). Т.е. скрытое окно, необходимое исключительно для организации цикла обработки сообщений. Наверное, тебе нужно что-то вроде этого.


--------------------
...
PM   Вверх
Zemelya
  Дата 14.2.2011, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да, действительно есть, я уже откапал ответ на этот вопрос, всем спасибо!!!

вот исходник для приема сообщений:

Код

#include "windows.h"
 
const int WM_MYMESSAGE = WM_USER + 1;
 
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch (msg)
        {
                case WM_DESTROY:
                        {
                                PostQuitMessage(0);
                                break;
                        }
                case WM_MYMESSAGE:
                        {
                                MessageBox(hwnd, "Message recieve!", "The message", MB_OK | MB_ICONINFORMATION);
                                PostMessage(hwnd, WM_CLOSE, 0, 0);
                                break;
                        }
                default:
                        return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
        HWND hwnd;
        MSG msg;
        WNDCLASS wc;
        memset(&wc, 0, sizeof(wc));
        wc.cbClsExtra=wc.cbWndExtra=0;
        wc.hInstance=hInstance;
        wc.lpfnWndProc=WndProc;
        wc.lpszClassName="Ghost Window";
        RegisterClass(&wc);
        hwnd=CreateWindowEx(0, wc.lpszClassName, "Title", 0, 0, 0, 0, 0, HWND_MESSAGE, 0, hInstance, 0);
        while (GetMessage(&msg, NULL, NULL, NULL))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        UnregisterClass(wc.lpszClassName, hInstance);
        return 0;
}


а вот и код для посылки: 

Код

//.............................
        HWND hwnd;
        hwnd = FindWindow("Ghost Window", NULL); //можно так же вместо NULL указать заголовок "Title"
        if (hwnd != NULL)
                SendMessage(hwnd, WM_USER+1, 0, 0);
        else
                MessageBox(hwnd, "Окно не найдено!", "Инфо", MB_OK | MB_ICONINFORMATION);
//.............................


все максимально и грубо упрощено, но тем не менее не обессудьте smile

если у кого че не компилится, я приложил два exe-шника.

компилил на MS VS 2008 Team System

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  prog.zip 41,76 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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