Автор
|
Тема: помогите разобраться, плиз
|
sleeps |
опубликован 07-02-2002 09:23 MSK
ситуация такая, я конечно извиняюсь, что засоряю топик такими нелепостями, но когда я учился ентого не было, а мои знакомые профессиональные программисты не смогли ответить полно на мой вопрос. Что такое Handle, это диапазон памяти или адрес, или еще что-то? Единственное, я уже начитался по ентому вопросу на "родном" языке, и не особо понял, термины облегчают фразу на слова, но прячут смысл от непосвященных. Проблема у меня следующая, я никак не могу понять, это статическая вещь или динамическая, почему если попросить прогу выдать список запущенных программ по алгоритму ниже, то результат сильно зависит от наличия/отсутствия комментариев перед строкой минимизации? Поясните мне, плиз, если не сложно, я понимаю, что вопрос слишком примитивный чтобы засорять топик, поэтому не обижусь если получу письмо :) void __fastcall TForm1::Button2Click(TObject *Sender) { int i; HWND winhandle; char buff[127]; winhandle = GetWindow(Handle,GW_HWNDFIRST); for(i=1;winhandle!=0;i++) {if ((winhandle!=Application->Handle)&&(IsWindowVisible(winhandle))&&(GetWindow(winhandle,GW_OWNER) == 0)&&(GetWindowText(winhandle,buff, sizeof(buff)))) { GetWindowText(winhandle, buff, sizeof(buff)); ListBox1->Items->Add(StrPas(buff)); // ShowWindow(minihandle,SW_MINIMIZE);} */ } winhandle = GetWindow(winhandle,GW_HWNDNEXT); } Label1->Caption=IntToStr(i); }
|
ADK
|
опубликован 07-02-2002 10:39 MSK
В основном хэндлы это указатели на структуры ядра системы, но могут быть чем угодно. Да и не нужно, чтобы они что-то означали. Программист должен воспринимать их как абстракции. |
server_mouse
|
опубликован 07-02-2002 10:45 MSK
HANDLE-ы -- объекты ядра. В общем случае всё сводится на void*. IMHO они являют собой ещё и ресурс системы, т.е. их количество ограничено, потому мелкомягкий и рекомендует не забывать CloseHandle(); |
sleeps
|
опубликован 07-02-2002 11:17 MSK
спасибо, не совсем понятно, но если это не суть важно, то ладно, просто я второй день бьюсь над тем, что у меня поностью игнорируется условие: winhandle == Application->Handleто есть я хочу свернуть все окна кроме моего, в цикле получаю следующий хандл, проверяю его на видимость, свернутость и не моё ли это окно и минимизирую... моё минимизируется вместе со всеми и на мольбы стать вновь активным реагировать отказывается... |
sleeps
|
опубликован 07-02-2002 11:20 MSK
да, и там ошибка - minihandle это winhandle, только там шла временная переменная, ну почему список задач зависит от того, сворачиваю я окна или нет, только из-за того, что SW_MINIMIZE возвращает мне следующий хандл? |
ADK
|
опубликован 07-02-2002 11:30 MSK
А ты в курсе, что в VCL Applicatioin->Handle вовсе не то окно, которое ты видишь? |
sleeps
|
опубликован 07-02-2002 11:45 MSK
нет... я же говорю, с хенделами я еще совсем почти не дружу... но я уже нагляделся вчера на интреснейший эффект. если по таймеру на свернутом окне пройдет команда: ShowWindow(Application->Handle,SW_MAXSIMIZE), то мое окно остается свернутым, а то, что разворачивается даже имени не имеет... |
One
|
опубликован 07-02-2002 14:12 MSK
Это надо знать - в Билдере все окна, с которыми ты работаеш имеют хендлы: Form1->Handle, Form2->Handle... Application - это родительское окно для всех окон (форм). В твоем случае надо вместо if((winhandle!=Application->Handle)... писать if((winhandle!=Handle)...А вообще лучше забей на GetWindow и используй EnumWindows. |