Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> убить окно explorer, что то DestroyWindow не бьет окно! 
:(
    Опции темы
burakov
Дата 22.12.2007, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Добрый день.
Помогите пожалуйста "убить окно" от explorer.exe

Внизу код. В нем я пытался консоль (cmd.exe) убить при помощи DestroyWindow (Win32::API) (выбрал консоль для примера, потому как это окно самого верхнего уровня, к тому же у меня получилось его убить при помощи SendMessage).

Но окно IE это ж куча окошек, классов. Прочитал, что DestroyWindow все убьет сама smile
Хочу при помощи DestroyWindow разобраться с IE, но эта DestroyWindow даже консоль мою отказывается убивать.

Код


#нахожу свою консоль

$FindWindow = Win32::API -> new ('user32', 'FindWindow', 'PP', 'I');
$result_FindWindow = $FindWindow -> Call ('ConsoleWindowClass', 'c:\windows\system32\cmd.exe');
print "$result_FindWindow\n";

#дискриптор окна выдает правильный - проверял при помощи WindowSpy

#теперь пытаюсь ее убить

$DestroyWindow = Win32::API -> new ('user32', 'DestroyWindow', 'I', 'I');
$result_DestroyWindow = $DestroyWindow -> Call ($result_FindWindow);
print "$result_DestroyWindow\n";



чего не так делаю?
Спасибо.



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
KSURi
Дата 22.12.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



Посылай окну WM_CLOSE


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
burakov
Дата 25.12.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



в случае с если с помощью SendMessage закрывать консоль (которую я нахожу c помощью FindWindow в примере), то 
все работает, но я хочу закрыть окно IE.

FindWindow мне мой IE (интернет эскплоер) находит нормально, дескриптор правильный отдает.
а вот закрывать не хочет.

подозреваю, что не закрывает 
из за того, что IE состоит из нескольких окошек (я ищу самое вернее класса CabinetWClass), 
причем
если к найденному $result_FindWindow применить функцию SwitchToThisWindow (user32.dll), то окно успешно активизируется и выводится на передний план,

но как его закрыть... может нужно послать WM_CLOSE Всем child окнам IE? НО  FindWIndow дочерние окна не ищет... тогда как узнать их хендлы?


Может кто уже убивал IE при помощи Win32::API... Подскажите...

Спасибо.





--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
KSURi
Дата 25.12.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



Цитата(burakov @  25.12.2007,  13:45 Найти цитируемый пост)
может нужно послать WM_CLOSE Всем child окнам IE?

Не-не, посылать надо родителю всех окон IE. Возможно ты по ошибке определил одно из дочерних его окон, а не родительское. Сверь класс родительского окна с его заголовком.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
burakov
Дата 26.12.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



не знаю я как опознать родителя.
Интуитивно нахожу идентификатор (дескриптор, хендлер) самого верхнего окна IE. класс его определяю при помощи WindowSpy (здесь же на форуме кто то мне ее посоветовал), там же отражается и дескриптор окна (это для проверки моего $result_FindWindow). Т.е. навожу мышкой на самую верхнюю часть IE (синяя полоска) и оттуда списываю класс искомого окна.

проверяю все на SwitchToThisWindow или $BringWindowToTop на найденном дескрипторе эти функции отрабатывают великолепно (т.е. перемещают найденное окно IE на передний план).

но SendMessage окно убивать отказывается (при этом если попытаться убить при помощи SendMessage консоль, как в приведенном примере, то все срабатывает отлично).

:(




--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
burakov
Дата 26.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



еще вопросик
по SendMessage - не могу разобраться, почему
WM_CLOSE = 0x0010 (выдернул из форума).

Вот так (с цифрами) все работает
$SendMessage = Win32::API -> new ('user32', 'SendMessage', 'INPL', 'N');
$result_SendMessage = $SendMessage -> Call ($result_FindWindow, 0x0010, 0, 0);

а если писать вот так (вместо цифр - WM_CLOSE то не работает).
$SendMessage = Win32::API -> new ('user32', 'SendMessage', 'INPL', 'N');
$result_SendMessage = $SendMessage -> Call ($result_FindWindow, WM_CLOSE, 0, 0);


а мне вот нужно окну winamp послать WM_User, тогда какие цифры вместо Слова "WM_User" писать?

Спасибо...


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
KSURi
Дата 26.12.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



Цитата(burakov @  26.12.2007,  15:23 Найти цитируемый пост)
Вот так (с цифрами) все работает
$SendMessage = Win32::API -> new ('user32', 'SendMessage', 'INPL', 'N');
$result_SendMessage = $SendMessage -> Call ($result_FindWindow, 0x0010, 0, 0);

а если писать вот так (вместо цифр - WM_CLOSE то не работает).
$SendMessage = Win32::API -> new ('user32', 'SendMessage', 'INPL', 'N');
$result_SendMessage = $SendMessage -> Call ($result_FindWindow, WM_CLOSE, 0, 0);

Про 0x0010 это я писал) Точно ответить не могу честно говоря, т.к. не разбирался, но есть подозрение, что при вызове API функции Perl передаст WM_CLOSE как строку (указатель на строку, если быть точным), а не как предопределенную именованную константу.

Значение нужной константы ищи в Си-шном заголовке windows.h или в заголовках, которые в него инклудятся. Точно уже не помню.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
shamber
Дата 28.12.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 1
Всего: 18



Код

#define WM_USER       0x0400

PM MAIL Jabber   Вверх
burakov
Дата 29.12.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Большое спасибо за ответы
вот какую страничку я нашел
http://gupta.narod.ru/WindowsSDKConstants.html
там и WM_USER и WM_COMMAND...

хотя таки убить окно Explorer не смог. Ну да ладно пока воспользуюсь wordpad.exe (он убивается на раз).


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.