Здравствуйте!
Может, глупый вопрос, но что есть CALLBACK функция?
И как пользоваться SetWindowsHookEx и EnumWindows?
Желательно с примером кода....
Заранее БОЛЬШОЕ спасибо!
Перенесено в WinAPI из С++. ДХ
Здравствуйте, Elf, Вы писали:
Elf>Может, глупый вопрос, но что есть CALLBACK функция?
По-русски это "функция обратного вызова".
Это
ваша функция, которую система может вызвать, чтобы, например, сообщить Вам о некотором событии. Типичный пример — оконная функция — она получает уведомления о событиях, относящихся к данному окну.
Elf>И как пользоваться SetWindowsHookEx и EnumWindows?
Лучше напишу про EnumWindows, так короче будет
#include <windows.h>
#include <stdio.h>
/* Вот наша функция обратного вызова */
BOOL CALLBACK MyEnumProc ( HWND hwnd, LPARAM lParam )
{
char title[1024]; /* Для большинства окон должно хватить */
GetWindowText ( hwnd, title, sizeof (title) );
printf ( "%d: %s\n", hwnd, title );
return TRUE; /* Продолжить перечисление */
}
void main ( void )
{
EnumWindows ( (WNDENUMPROC)MyEnumProc, (LPARAM)NULL );
}
Результатом запуска программы будет список окон верхнего уровня.
Главные требования для подобных функций:
1) Наличие модификатора CALLBACK;
2) Совпадение количества и типов параметров и возвращаемого значения.
Обратите внимание, что экспортировать функцию не обязательно, Windows все равно сможет вызвать функцию, даже если Вы объявите ее static.
Здравствуйте, Алексей Владимирович Миронов, Вы писали:
АВМ>Здравствуйте, Elf, Вы писали:
Elf>>Может, глупый вопрос, но что есть CALLBACK функция?
АВМ>По-русски это "функция обратного вызова".
АВМ>Это ваша функция, которую система может вызвать, чтобы, например, сообщить Вам о некотором событии. Типичный пример — оконная функция — она получает уведомления
А есть ли ограничение на CALLBACK?
Т.е. все ли функции можно сделать callback или нет?
От чего это зависит?
... << RSDN@Home 1.0 beta 3 >>
Здравствуйте, LaFlour, Вы писали:
LF>А есть ли ограничение на CALLBACK?
LF>Т.е. все ли функции можно сделать callback или нет?
LF>От чего это зависит?
#define CALLBACK __stdcall
Исходя из етого ты не сможешь сделать callback функции с переменным числом параметров и thiscall (функции — члены)
Здравствуйте, Patalog, Вы писали:
LF>>А есть ли ограничение на CALLBACK?
LF>>Т.е. все ли функции можно сделать callback или нет?
LF>>От чего это зависит?
P>P>#define CALLBACK __stdcall
P>Исходя из етого ты не сможешь сделать callback функции с переменным числом параметров и thiscall (функции — члены)
Согласен с маленьким уточнением: функции обратного вызова, как это явствует из названия, вызываются "внешними силами", например операционной системой (или C-рантаймом). Поэтому имеет смысл делать CALLBACK только те функции, которые а) делают то, что от них ожидает система, б) принимают правильное количество аргументов правильных типов, в) возвращают результат правильного типа. Только так. Шаг вправо/влево карается. Пример: оконная процедура, не передающая управление DefWindowProc, скорее всего, "повесит" соответствующее окно.
Вообще, единственное, что имеет смысл менять в заголовке CALLBACK-функции, это имя. Все остальное — методом Copy/Paste.