Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.198.173] |
|
Сообщ.
#1
,
|
|
|
Всем привет. Имеется программа, которая дает возможность подключать к себе пользовательские dll. Пишу код, который запускает некое окно данной программы с помощью PostMessage:
сначала проверяю, запущена ли сама программа Handle = FindWindow("..тут класс окна программы...", NULL); все ОК, программа найдена, далее PostMessage(Handle, WM_COMMAND, 0x100, NULL) окно стартует нормально, но комманда FindWindow (следующая строка кода) не видит его. HandleM = FindWindow("...класс нового окна...", NULL); хотя если скомпилировать код в EXE, все работает. В чем моя ошибка? Спасибо. |
Сообщ.
#2
,
|
|
|
Похоже на то, что второй FindWindow вызывается раньше, чем обрабатывается сообщение. Попробуй сообщение отправить синхронно, через SendMessage.
|
Сообщ.
#3
,
|
|
|
Цитата Олег М @ Похоже на то, что второй FindWindow вызывается раньше, чем обрабатывается сообщение. Попробуй сообщение отправить синхронно, через SendMessage. ...тогда программа ждет, пока пользователь не закроет открывшееся окно, а мне нужно закрыть его самому. Задержка, типа Sleep(500-5000), ничего не дает. |
Сообщ.
#4
,
|
|
|
Цитата Syslik @ хотя если скомпилировать код в EXE, все работает. В чем моя ошибка? Спасибо. А как ты смотришь, в отладчике? И окна у тебя в одном процессе или разных? |
Сообщ.
#5
,
|
|
|
Цитата Олег М @ Цитата Syslik @ хотя если скомпилировать код в EXE, все работает. В чем моя ошибка? Спасибо. А как ты смотришь, в отладчике? И окна у тебя в одном процессе или разных? Да. Если код вынести в отдельное приложение и смотреть под отладчиком, тогда переменной HandleM присваивается HWND нового окна. HandleM = FindWindow("...класс нового окна...", NULL); Окна в одном (я так думаю). 1. ищу основное окно - OK; 2. посылаю комманду для открытия некой формы - OK; 3. ищу окно этой формы, и ... из dll - NULL, exe - не NULL |
Сообщ.
#6
,
|
|
|
Цитата Syslik @ Да. Если код вынести в отдельное приложение и смотреть под отладчиком, тогда переменной HandleM присваивается HWND нового окна. PostMessage просто кладёт сообщение в очередь. Под отладчиком обработчик тоже останавливается и просто не успевает его потом достать оттуда до вызова FindWindow. Непонятно, почему Sleep не помогает, но неважно. В целом, такая проблема может произойти в любой момент. Здесь надо второй вызов FindWindow делать в цикле, несколько раз с небольшой задержкой ~100ms, пока не найдётся окно/ Добавлено Кстати, там сообщения вроде в одном потоке обрабатываются, поэтому твоё сообщение отработает только после выхода из функции которая вызывает PostMessage-FindWindow. Сделай этот вызов в отдельносм потоке. |
Сообщ.
#7
,
|
|
|
Цитата Олег М Кстати, там сообщения вроде в одном потоке обрабатываются, поэтому твоё сообщение отработает только после выхода из функции которая вызывает PostMessage-FindWindow. Сделай этот вызов в отдельносм потоке. во время выполнения кода я так и нонял, что PostMessage срабатывает после FindWindow (окончания процедуры), поэтому и пустое значение. Буду пробовать с потоками. Спасибо за идею. int result = PostMessage(Handle, WM_COMMAND, 0x100, NULL); int n = 0; HandleM = NULL; while (n < 10 || HandleM){ Sleep(200); HandleM = FindWindow("...", NULL); n++; }; |
Сообщ.
#8
,
|
|
|
Сделал в потоке, результат тот же... Может еще Event подключить?
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 в потоке после некой задержки. |
Сообщ.
#9
,
|
|
|
Да, вынес FindWindow в поток и все заработало! Спасибо Олег за помощь.
Одна голова хорошо, две - лучше, а три - уже повод выпить |