На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> FindWindow из dll
    Всем привет. Имеется программа, которая дает возможность подключать к себе пользовательские dll. Пишу код, который запускает некое окно данной программы с помощью PostMessage:
    сначала проверяю, запущена ли сама программа
    Handle = FindWindow("..тут класс окна программы...", NULL);
    все ОК, программа найдена, далее
    PostMessage(Handle, WM_COMMAND, 0x100, NULL)
    окно стартует нормально, но комманда FindWindow (следующая строка кода) не видит его.
    HandleM = FindWindow("...класс нового окна...", NULL);
    хотя если скомпилировать код в EXE, все работает. В чем моя ошибка? Спасибо.
      Похоже на то, что второй FindWindow вызывается раньше, чем обрабатывается сообщение. Попробуй сообщение отправить синхронно, через SendMessage.
        Цитата Олег М @
        Похоже на то, что второй FindWindow вызывается раньше, чем обрабатывается сообщение. Попробуй сообщение отправить синхронно, через SendMessage.

        ...тогда программа ждет, пока пользователь не закроет открывшееся окно, а мне нужно закрыть его самому. Задержка, типа Sleep(500-5000), ничего не дает.
          Цитата Syslik @
          хотя если скомпилировать код в EXE, все работает. В чем моя ошибка? Спасибо.

          А как ты смотришь, в отладчике? И окна у тебя в одном процессе или разных?
            Цитата Олег М @
            Цитата Syslik @
            хотя если скомпилировать код в EXE, все работает. В чем моя ошибка? Спасибо.

            А как ты смотришь, в отладчике? И окна у тебя в одном процессе или разных?

            Да. Если код вынести в отдельное приложение и смотреть под отладчиком, тогда переменной HandleM присваивается HWND нового окна.
            HandleM = FindWindow("...класс нового окна...", NULL);

            Окна в одном (я так думаю).
            1. ищу основное окно - OK;
            2. посылаю комманду для открытия некой формы - OK;
            3. ищу окно этой формы, и ... из dll - NULL, exe - не NULL :)
              Цитата Syslik @
              Да. Если код вынести в отдельное приложение и смотреть под отладчиком, тогда переменной HandleM присваивается HWND нового окна.

              PostMessage просто кладёт сообщение в очередь. Под отладчиком обработчик тоже останавливается и просто не успевает его потом достать оттуда до вызова FindWindow.
              Непонятно, почему Sleep не помогает, но неважно. В целом, такая проблема может произойти в любой момент. Здесь надо второй вызов FindWindow делать в цикле, несколько раз с небольшой задержкой ~100ms, пока не найдётся окно/

              Добавлено
              Кстати, там сообщения вроде в одном потоке обрабатываются, поэтому твоё сообщение отработает только после выхода из функции которая вызывает PostMessage-FindWindow. Сделай этот вызов в отдельносм потоке.
              Сообщение отредактировано: Олег М -
                Цитата Олег М
                Кстати, там сообщения вроде в одном потоке обрабатываются, поэтому твоё сообщение отработает только после выхода из функции которая вызывает PostMessage-FindWindow. Сделай этот вызов в отдельносм потоке.


                во время выполнения кода я так и нонял, что PostMessage срабатывает после FindWindow (окончания процедуры), поэтому и пустое значение. Буду пробовать с потоками. Спасибо за идею.
                ExpandedWrap disabled
                        int result = PostMessage(Handle, WM_COMMAND, 0x100, NULL);
                        int n = 0;
                        HandleM = NULL;
                        while (n < 10 || HandleM){
                           Sleep(200);
                           HandleM = FindWindow("...", NULL);
                           n++;
                        };
                  Сделал в потоке, результат тот же... Может еще Event подключить?
                  ExpandedWrap disabled
                          TTHRMessage *TMsg = new TTHRMessage();
                          TMsg->FreeOnTerminate = false;
                          TMsg->Handle = Handle;
                          TMsg->wParam = 0x100;
                          TMsg->Resume();
                          TMsg->WaitFor();
                          // Sleep(500);
                          HandleM = FindWindow("TForm", NULL);
                     
                    ну и код в методе Execute
                          void __fastcall Execute()
                          {
                             PResult = PostMessage(PHandle, WM_COMMAND, PParam, NULL);
                          };


                  P.S. нужное окно открывается после выполнения кода. Попробую сделать поиск окна FindWindow в потоке после некой задержки.
                  Сообщение отредактировано: Syslik -
                    Да, вынес FindWindow в поток и все заработало! Спасибо Олег за помощь.
                    Одна голова хорошо, две - лучше, а три - уже повод выпить ;)
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0382 ]   [ 16 queries used ]   [ Generated: 28.03.24, 16:46 GMT ]