| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Обработка сообщений приложением |
| Автор: Zemelya 12.2.2011, 20:36 | ||||||
| Добрый день, господа программисты! У меня диллема. Поиск удовлетворительных результатов не принес, в силу специфики, на мой взгляд, вопроса. Начинаю осваивать MS Visual C++, до этого лет 6 писал исключительно на Delphi. Мне нужно написать приложение, которое не нуждается в форме, но должно получать сообщения из вне. То есть программа висит (не в смысле зависла нужно что-то вроде этого:
только не создавая класс окна и его самого, оно ненужно. Мне нужно (если это вообще возможно по спецификации) подменить оконную процеду с помощью функции SetWindowLong(HWND, GWL_WNDPROC, адрес_новой_проц) вот только, как я понимаю HWND приложения (процесса) мне не получить (он же не окно
как видно на моем примере, я пытался преобразовать hInstanse приложения в HWND, что подозреваю не совсем правильно, поскольку реакции приложения не последовало, я имею ввиду в WndProc не заходит. Во-первых потому что застревает на GetMessage ожидая сообщений, которых почему-то нету, во-вторых если заменить ожидающий GetMessage на просматривающий PeekMessage то приложение зацикливается, выгребая все ресурсы камня на себя. В делфи подобная конструкция работает, только там вместо hInstanse я передавал Application.Handle На сколько я вообще знаю, то сообщения ведь получает сам процесс, а потом в зависимости от хэндла окна, в которое оно посылалось, процесс пересылает его одному из своих окон, ну если точнее то окно, для которого пришло сообщение само выбирает его из очереди сообщений, если согласно хэндлу оно принадлежит ему. Так ли это на самом деле? Так вот, подытожу. Ответьте мне пожалуйста на вопрос, может ли приложение получать "оконные сообщения" не имея окон вообще (чет даж звучит странно), и если все таки такое чудо возможно, ткните носом как правильно подменить процедуру. Еще раз повторюсь, что окно создавать мне ненужно, как с окном это все провернуть на С++ я уже знаю
|
| Автор: KaraKum 12.2.2011, 20:41 |
| Окна получают специфичные для окон сообщения: "перерисуйся" (когда его сворачивают-разворачивают или двигают поверх него другое окно); "закройся" (когда окно закрывают); "клик мыши"; "нажатие клавиши в момент фокуса окна" и так далее. А какие сообщения подразумевается получать, не имея, при этом, окна? Если не нужно создавать окон, то это консольное приложение. |
| Автор: Earnest 14.2.2011, 10:18 |
| Есть специальный тип окон (Message Window, как-то так). Т.е. скрытое окно, необходимое исключительно для организации цикла обработки сообщений. Наверное, тебе нужно что-то вроде этого. |
| Автор: Zemelya 14.2.2011, 12:45 | ||||
| да, действительно есть, я уже откапал ответ на этот вопрос, всем спасибо!!! вот исходник для приема сообщений:
а вот и код для посылки:
все максимально и грубо упрощено, но тем не менее не обессудьте если у кого че не компилится, я приложил два exe-шника. компилил на MS VS 2008 Team System |