|
Вопрос # 5 537/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Задача передвинуть окно в нужное мне положение в момент создания.
Разумеется хук уже поставлен:
procedure SetCreateWindowHook; stdcall; export;
begin
HLibrary:= LoadLibrary('MovWin32.dll');
ParentHandle:= FindWindow('EXEClass',nil);
TId:= GetWindowTask(ParentHandle);
HookHandle:=SetWindowsHookEx(WH_CBT, @CBTHook, HLibrary, TId);
end;
Тут проблем нету.
Теперь собственно CBTHook:
procedure CBTHook(Code: Integer; WParam, LParam: DWord); stdcall;
var
Result: DWORD;
begin
Result:= CallNextHookEx(HookHandle, CODE, WParam, LParam);
case CODE of HCBT_CREATEWND:
begin
ChildHandle:= FindWindowEx(ParentHandle, 0,'ChildEXEClass', nil);
MoveWindow(ChildHandle, -1, -10, 795, 575, true);
end;
end;
end;
Вот тут самое интересное. Разумеется так не работает с первым окном.
Это код был написан когда я вообще в хуках ничего не понимал. Теперь я понимаю что FindWindowEx не извлекёт хендл т.к. она это делает на момент перед созданием окна. Такой код работает при открытии второго окна. При создании второго окна первое перемещается куда нужно.
Вопрос в том как извлеч хендл создаваемого окна и выполнить MoveWindow с ним?
Если можете укажите книги где эта тема разбирается, такой помощи тоже буду рад.
Примечание #1 (29 июля 2011, 00:23): Ну разумеется все коды которые я привёл находятся в DLL.
С експортом разобрался в основном коде всё объявлено, всё экспортированно, всё работает
Примечание #2 (20 октября 2011, 12:24): И разумеется CBTHook не процедура а функция.
Примечание #3 (20 октября 2011, 12:30): И разумеется CBTHook не процедура а функция.
 |
Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 29 июля 2011, 00:20
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 31 июля 2011, 18:43; участников в обсуждении: 4.
|
Gooddy (статус: 3-ий класс), 29 июля 2011, 00:37 [#1]:
А не передают ли нам хендл окошка в Lparam или Wparam?
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 29 июля 2011, 00:41 [#2]:
Почитал. Либо проверяй событие HCBT_ACTIVATE (что не тру) либо бери хендл из WParam.
Чисти код! Чисти код! Чисти код!
|
|
QWERYTY (статус: Посетитель), 29 июля 2011, 01:47 [#3]:
Да, так и пишут что WParam содержит хендл будующего окна.
Но как его получить не пойму. Пытался подставить WParam в MoveWindow, но не тут то было. И проверить не могу при попытке вывести WParam(чтоб посмотреть что там вообще) через ShowMessage окно на которое хук не открывается и сообщение тоже не появляется.
Работать с хуками и длл начал неделю назад и для меня это лес густой.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
Вадим К (статус: Академик), 29 июля 2011, 10:55 [#4]:
Поставлю вопрос по другому. А есть ли гарантия, что на момент срабатывания хука окно уже создано? Как по мне, то оно находится в процессе и его ещё нельзя сдвинуть.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
QWERYTY (статус: Посетитель), 29 июля 2011, 11:10 [#5]:
Точно не знаю. Пишут что вроде хендл уже существует, также пишут что на данный момент ему можно поставить сообщение в очередь. Я так понял наступит время когда окно создастся и сообщение выполнится.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 29 июля 2011, 11:12 [#6]:
Не злитесь если по долгу не буду отвечать.
Близжайшие дни будут проблемы с интернетом, он то будет то нет.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 29 июля 2011, 11:57 [#7]:
Цитата (QWERYTY):
GetWindowTask
Хмм...
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 29 июля 2011, 20:24 [#8]:
Багменот, как понимать "Хмм... " ?
Там была какая то другая функция, но она сложней в использовании. Мне трудности лишние не нужны, учитывая что эта функция работает как часы.
На счёт хендла вопрос в силе.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 30 июля 2011, 14:13 [#9]:
Цитата (QWERYTY):
Мне трудности лишние не нужны
Ага, и 16-битную функцию эксгумировал исключительно для стобильнасти... Почему сразу нормально-то не писать?
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 31 июля 2011, 05:02 [#10]:
Мне по сути не важно, хоть она была бы 8-битная.
Функция выполняет свою функцию(извеняюсь за тафталогию), на другие операционки переходить не планирую.
Или я чегото не понимаю?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 31 июля 2011, 18:43 [#11]:
Цитата (QWERYTY):
Мне по сути не важно
Да мне, собственно, тоже, у меня-то всё работает =)
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|