Я где-то читал что Handle окна возвращаемый некоторыми функциями нельзя использовать на продолжительное время.
Теперь я не могу найти где это я читалб по моему в MSDN. И я начал сомневаться в этом. Мне интересно так это на самом деле или нет? И если это так, то в каких случаях Windows меняет Handle окна.
Проблема в следующем, мне нужно хранить Handle некоторого приложения в протяжении всего его существования (от запуска до закрытия), и чуть ли не существования системы, потому что это приложение запускается почти что вместе с системой (скажем так, компьютер включают только ради него).
Конечно можно получать Handle каждый раз при помощи FindWindow, но дело в том что заголовок окна этого приложения все время меняется, хотя часть этого заголовка остается неизменным.
Здравствуйте, v14d, Вы писали:
V>Проблема в следующем, мне нужно хранить Handle некоторого приложения в протяжении всего его существования (от запуска до закрытия), и чуть ли не существования системы, потому что это приложение запускается почти что вместе с системой (скажем так, компьютер включают только ради него).
Поставь на поток, владеющий этим окном хук WH_CALLWNDPROC*,
тогда при разрушении окна можно реагировать на WM_DESTROY.
Здравствуйте, v14d, Вы писали:
V>Я где-то читал что Handle окна возвращаемый некоторыми функциями нельзя использовать на продолжительное время. V>Теперь я не могу найти где это я читалб по моему в MSDN. И я начал сомневаться в этом. Мне интересно так это на самом деле или нет? И если это так, то в каких случаях Windows меняет Handle окна. V>Проблема в следующем, мне нужно хранить Handle некоторого приложения в протяжении всего его существования (от запуска до закрытия), и чуть ли не существования системы, потому что это приложение запускается почти что вместе с системой (скажем так, компьютер включают только ради него). V>Конечно можно получать Handle каждый раз при помощи FindWindow, но дело в том что заголовок окна этого приложения все время меняется, хотя часть этого заголовка остается неизменным.
Дескриптор окна не меняется в течение всего времени существования окна. Доказательство элементарно. Создаем окно
hWnd = CreateWindow(...);
Если теперь в моей программе вдруг ни с того ни с сего окажется, что у этого окна другой дескриптор — все, я отказываюсь писать программы для Windows
А читал ты, скорее всего, вот что. Утверждать, что если дескриптор не изменился, то это то же самое окно, нельзя. Потому что оно могло быть уничтожено и создано новое, случайно с тем же дескриптором.
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Поставь на поток, владеющий этим окном хук WH_CALLWNDPROC*, LT>тогда при разрушении окна можно реагировать на WM_DESTROY.
На самом деле мне это не понадобится, потому что это главное окно приложения.
Спасибо.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Дескриптор окна не меняется в течение всего времени существования окна. Доказательство элементарно. Создаем окно
PD>hWnd = CreateWindow(...);
Именно учитывая этот факт, я и начал сомневаться.
Мне кажется я вспомнил что это я читал, там говорилось не следует сохранять Handle на продолжительное время например в файл на жестком диске (даже глупо, не правда ли?)
Спасибо.
V>>Мне кажется я вспомнил что это я читал, там говорилось не следует сохранять Handle на продолжительное время например в файл на жестком диске
U>Хендл писать в файл? Гы, какую траву ты курил?
Не в первый раз наблюдаю от Вас такие высказывания. В общем, это... давайте выражать свои мысли более культурно и ясно. Если есть что сказать по делу — говорите внятно, а превращать форум в, извиняюсь, сортир (с) Путин — не надо. Спасибо.
AS>В общем, это... давайте выражать свои мысли более культурно и ясно.
Давайте.
Вот пусть всякие v14d и начнут, так сказать, показывать пример.
А мне ваши замечания не интересны.
Найдите кого-нибудь ещё, к кому можно придраться.
Реагировать на подобные замечания более не стану, извините.
> Конечно можно получать Handle каждый раз при помощи FindWindow, но дело в том что заголовок окна этого приложения все время меняется, хотя часть этого заголовка остается неизменным.
А можно то самое окно (если оно свое) о чем нибудь спросить!?!
Примерно так
1) const UINT message=RegisterWindowMessage("Ты ли это радость моя?");
2) const HWND hwndFind = FindWindow(...) — вроде что-то нашли, вроде как искомое окно!?!
3) SendMessageTimeout(hwndFind,....) — спросили найденное окно, если оно то, что нужно ответит например 1. Все остальные окна проигнорируют наше сообщение.
Хотя конечно
а) если искомое окно "свое" и мы можем добавить в нем обработку сообщения "Ты ли это радость моя?"
б) ну вообще окно может и не ответить в заданный срок, даже если и свое, если чем-то будет занято (например показывать MessageBox с текстом "Да я это! Я").
А если чужое то видимо лучше действительно использовать хук. Тогда можно быть уверенным что не пропустишь тот случай, когда окно закрыто, а система и таки вот успела создать другое окно с тем же HWND.
V>Я где-то читал что Handle окна возвращаемый некоторыми функциями нельзя использовать на продолжительное время. V>Теперь я не могу найти где это я читалб по моему в MSDN.
If your Win32 code in OnParentNotify requires the child ID, retrieve it like this:
CWnd* pChild = FromHandle( (HWND)lParam );
int nID = pChild->GetDlgCtrlID();
In this example, FromHandle returns the CWnd object attached to the child window handle. The GetDlgCtrlID member function returns the child window ID. You could also retrieve the child ID by passing the child handle directly to the Windows GetDlgCtrlID function, but the code above also retrieves a pointer to the child CWnd object.
The pointer returned in pChild is temporary and should not be stored for use beyond the scope of OnParentNotify.