Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2013, 11:42   #1
crazygoldbullet
 
Регистрация: 24.02.2013
Сообщений: 7
Смущение Hook, как убедиться в том, что это нужное мне окно

У меня есть программа, которая создаёт окно, заголовок которого 'Form1'. Используя хуки, мне нужно изменить это окно до того, как это окно появится (например, сделать так, что окно появится с другими координатами).
Проблема в том, что если делать это, учитывая, что Code=HCBT_CREATEWND, то я не могу использовать GetWindowText, чтобы убедиться, что это нужное мне окно с заголовком 'Form1'. Если я использую GetClassName, то получаю класс "Window" (но ведь в системе может быть не одно окно с таким классом). Исправьте пожалуйста код моей dll, чтобы решить эту задачу. Заранее спасибо.
Вот код моей dll:

Код:
library my_dll;
uses Windows;
var
	SysHook : HHook = 0;
function CBTProc(code : integer; wParam : wParam; lParam : longint) : longint; stdcall;
var
	WndHeader:array [0..MAX_PATH-1] of Char;
	Wnd:HWND;
begin
	if Code>=0 then
	begin
		case Code of
			HCBT_CREATEWND:
			begin
				Wnd:=wParam;
				{if (Wnd<>0) then GetWindowText(Wnd,WndHeader,MAX_PATH);
				if (WndHeader='Form1') then
				...}
			end;
		end;
		Result := 0;
	end
	else
		Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;
procedure hook export; stdcall;
begin
    SysHook := SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
end;
procedure unhook export; stdcall;
begin
	UnhookWindowsHookEx(SysHook);
end;
exports hook,unhook;
begin
end.
crazygoldbullet вне форума Ответить с цитированием
Старый 14.08.2013, 23:27   #2
crazygoldbullet
 
Регистрация: 24.02.2013
Сообщений: 7
По умолчанию

Удалось узнать заголовок с помощью PCBTCREATEWND(LParam).lpcs.lpszName

Теперь нужно изменить координаты создаваемого окна...

В msdn написано:
Цитата:
At the time of the HCBT_CREATEWND notification, the window has been created, but its final size and position may not have been determined and its parent window may not have been established. It is possible to send messages to the newly created window, although it has not yet received WM_NCCREATE or WM_CREATE messages. It is also possible to change the position in the z-order of the newly created window by modifying the hwndInsertAfter member of the CBT_CREATEWND structure.
Но я так и не нашел конкретного примера, показывающего как можно изменить Z координату создаваемого окна, изменив hwndInsertAfter. Покажите, пожалуйста, этот пример.
Пытался использовать: MoveWindow, SetWindowPos. Также пробовал делать так: "PCBTCREATEWND(LParam).lpcs.x:= 0" (и тоже самое с y).
Но у меня так и не получилось изменить координаты создаваемого окна...

Последний раз редактировалось crazygoldbullet; 14.08.2013 в 23:30.
crazygoldbullet вне форума Ответить с цитированием
Старый 25.08.2013, 03:10   #3
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

Не лишним будет проверять еще и какому процессу принадлежит окно(GetWindowThreadProcessId).

Form1 - это болезнь Delphi/C++Builder, там много чего дополнительного напихано в RTL, т.е. после создания окна(о чем информирует HCBT_CREATEWND) RTL delphi/builder`а самостоятельно изменяет положение окна - MoveWindow/SetWindowPos.

Рекомендую сначала запоминать нужный хендл(во время HCBT_CREATEWND), потом ловить HCBT_MOVESIZE, проверять хендл и изменять PRECT(LParam).Left := 0

+не забыть флаг какой-то поставить, что начальное положение окна уже изменялось, иначе потом не сдвинуть будет

Последний раз редактировалось asmprog; 25.08.2013 в 03:13.
asmprog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать, чтобы после нажатия кнопки выводилось нужное мне окно? phantasmagoria Помощь студентам 5 28.04.2011 23:43
Необходимо сделать удаление как в динамическом массиве, сложность в том что массив обычный Сеня2007 Помощь студентам 3 22.11.2010 08:31
Hook - что это? VintProg Общие вопросы Delphi 2 20.06.2010 12:18
Что это такое и как это того... Alex Cones Общие вопросы Delphi 2 11.10.2009 12:04
Как же мне это сделать? DBgrid khaz Компоненты Delphi 4 12.02.2007 08:58