Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 29 июля 2011, 00:20
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 31 июля 2011, 18:43; участников в обсуждении: 4.
Gooddy

Gooddy (статус: 3-ий класс), 29 июля 2011, 00:37 [#1]:

А не передают ли нам хендл окошка в Lparam или Wparam?
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 29 июля 2011, 00:41 [#2]:

Почитал. Либо проверяй событие HCBT_ACTIVATE (что не тру) либо бери хендл из WParam.
Чисти код! Чисти код! Чисти код!
QWERYTY

QWERYTY (статус: Посетитель), 29 июля 2011, 01:47 [#3]:

Да, так и пишут что WParam содержит хендл будующего окна.
Но как его получить не пойму. Пытался подставить WParam в MoveWindow, но не тут то было. И проверить не могу при попытке вывести WParam(чтоб посмотреть что там вообще) через ShowMessage окно на которое хук не открывается и сообщение тоже не появляется.
Работать с хуками и длл начал неделю назад и для меня это лес густой.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
Вадим К

Вадим К (статус: Академик), 29 июля 2011, 10:55 [#4]:

Поставлю вопрос по другому. А есть ли гарантия, что на момент срабатывания хука окно уже создано? Как по мне, то оно находится в процессе и его ещё нельзя сдвинуть.
Галочка "подтверждения прочтения" - вселенское зло.
QWERYTY

QWERYTY (статус: Посетитель), 29 июля 2011, 11:10 [#5]:

Точно не знаю. Пишут что вроде хендл уже существует, также пишут что на данный момент ему можно поставить сообщение в очередь. Я так понял наступит время когда окно создастся и сообщение выполнится.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 29 июля 2011, 11:12 [#6]:

Не злитесь если по долгу не буду отвечать.
Близжайшие дни будут проблемы с интернетом, он то будет то нет.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 29 июля 2011, 11:57 [#7]:

Цитата (QWERYTY):

GetWindowTask

Хмм...
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 29 июля 2011, 20:24 [#8]:

Багменот, как понимать "Хмм... " ?
Там была какая то другая функция, но она сложней в использовании. Мне трудности лишние не нужны, учитывая что эта функция работает как часы.

На счёт хендла вопрос в силе.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 30 июля 2011, 14:13 [#9]:

Цитата (QWERYTY):

Мне трудности лишние не нужны

Ага, и 16-битную функцию эксгумировал исключительно для стобильнасти... Почему сразу нормально-то не писать?
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 31 июля 2011, 05:02 [#10]:

Мне по сути не важно, хоть она была бы 8-битная.
Функция выполняет свою функцию(извеняюсь за тафталогию), на другие операционки переходить не планирую.
Или я чегото не понимаю?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 31 июля 2011, 18:43 [#11]:

Цитата (QWERYTY):

Мне по сути не важно

Да мне, собственно, тоже, у меня-то всё работает =)
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.03 сек.