Опять переносимость...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Опять переносимость...

Сообщение Vitaliy » 08.07.2003 (Вт) 10:38

Может кто знает, в чем проблема:
На WIN2000 все работает, а в 98-й - не хочет.
Вот часть кода:
Private Sub Command2_Click()
hProcess = OpenProcess(&H1F0FFF, 1, mWnd)
TerminateProcess hProcess, 0
TrayI.cbSize = Len(TrayI)
TrayI.hWnd = nRet
TrayI.uId = 1&
Shell_NotifyIcon NIM_DELETE, TrayI
End Sub

nRet - hWnd окна, которое поместило иконку в трей.

Т.е. в 98-й не удаляется иконка из трея после убития приложения
:cry:

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 08.07.2003 (Вт) 12:41

Не мучайтесь, проще помещать в трей свою иконку, мочить приложение, убирать свою иконку. Эффект тот-же.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Сообщение Vitaliy » 08.07.2003 (Вт) 14:11

Да не работает оно так!!!! Уже пробовал...

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 08.07.2003 (Вт) 14:19

Да? :shock: Щас проверю. Ещё раз.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 08.07.2003 (Вт) 14:47

Так, точно не работает. Говорила мне мама: "Сынок, мля, никогда не убивай исходники, даже когда они тебе кажутся ненужными".
Ведь я это делал... А потом, придурок, исходник удалил.
Ладно, попробую вспомнить.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 08.07.2003 (Вт) 17:39

Так, а если наоборот, сначала делетить иконку, а потом мочить приложение?
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Сообщение Vitaliy » 09.07.2003 (Ср) 8:48

Увы, и так не работает :( И как с ним бороться?

STING
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 19.06.2003 (Чт) 17:20

Re: Опять переносимость...

Сообщение STING » 09.07.2003 (Ср) 9:22

Vitaliy писал(а):Может кто знает, в чем проблема:
На WIN2000 все работает, а в 98-й - не хочет.
Вот часть кода:
Private Sub Command2_Click()
hProcess = OpenProcess(&H1F0FFF, 1, mWnd)
TerminateProcess hProcess, 0
TrayI.cbSize = Len(TrayI)
TrayI.hWnd = nRet
TrayI.uId = 1&
Shell_NotifyIcon NIM_DELETE, TrayI
End Sub

nRet - hWnd окна, которое поместило иконку в трей.

Т.е. в 98-й не удаляется иконка из трея после убития приложения
:cry:


Засунь в Unload формы - Tray1.ShowIcon False.

Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Сообщение Vitaliy » 09.07.2003 (Ср) 9:57

Засунь в Unload формы - Tray1.ShowIcon False. :?:


1. Дак это-ж не моя форма (вернее - иконка) в трее сидит. Это другое приложение, которое запускает моя программа и которое она должна выгружать.

2. А где взять ShowIcon если у меня TrayI объявляется как пользовательский тип....

Или я чего-то не понял?[/code]

STING
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 19.06.2003 (Чт) 17:20

Сообщение STING » 09.07.2003 (Ср) 11:58

Раз чужое приложение, то это рабртать не будет... надо подумать... :roll:

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 09.07.2003 (Ср) 14:54

Меня терзают смутные сомнения, что hWnd по которому вы делетите иконку неверен.
Для проверки напишите программу, которая в цикле шлёт NIM_DELETE постоянно наращивая hWnd.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 09.07.2003 (Ср) 16:35

MEMBER писал(а):Меня терзают смутные сомнения, что hWnd по которому вы делетите иконку неверен.
Для проверки напишите программу, которая в цикле шлёт NIM_DELETE постоянно наращивая hWnd.


Если хотите проверить hWnd, то проще и надежней использовать программку типа Spy++ или бесплатный аналог: Winspector Spy.

И потом, я может быть конечно не прав, но как-то здесь уже обсуждалась похожая проблема и выяснилось, что прога-та закрывается, а вот иконка в трее просто не убирается(перерисовывается), остается тупо висеть и предлагалось просто сначала типа снять ее, а потом уже закрывать прогу...
Главное двигаться не быстрее, чем думает твоя голова.

Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Сообщение Vitaliy » 09.07.2003 (Ср) 17:08

Да, действительно, необходимо сначала удалять иконку, а потом удалять приложение. Если я беру какой-то диапазон от моего вычисленного hWnd
(hWnd - и hWnd +) и прохожусь в цикле по трею на предмет удаления иконки (как советовал MEMBER), то иногда она удаляется. Причем всегда диапазон меняется... Не знаю, то ли hWnd не правильно вычисляется, то ли еще что-то.
Кстати, в Spy++ hWnd окна в шестнадцатиричном виде, а у меня, судя по всему, в десятичном. Может ли это влиять?
Хотя, на 2000-й все работает без проблем... :!:

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 09.07.2003 (Ср) 17:15

SergeySV
Спасибо, я знаю как это делается. Проблема не в получении hWnd, проблема в получении hWnd окна поместившего в трей иконку. А это не обязательно главная форма.

Vitaliy
Давайте по порядку. Вам надо убивать только конкретное приложение, или любое? Можно сделать так - находим hWnd главной формы, потом находим hWnd её дочерних окон. Перед убийством отправляем в цикле NIM_DELETE с hWnd всех найденных окон.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Сообщение Vitaliy » 10.07.2003 (Чт) 9:07

MEMBER: Мне надо убивать конкретное приложение. Это коммуникационная программа, с которой взаимодействует моё приложение. Дочерних окон у неё вроде нет. Заголовок окна у неё меняется в зависимости от условий работы.
Проблема состоит в том, что в 2000-й все работает без проблем - по вычисленному hWnd формы из трея удаляется и иконка и убивается приложение. В 98-й - приложение убивается, а иконка не удаляется :(
Я уже и не знаю, что с ним делать... Может есть какая-нибудь функция, перерисовывающая трей, или как с ним бороться?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.07.2003 (Чт) 9:50

Где же наша система хранения полезных исходников? Была бы - выложил бы... Хотя ещё добраться нужно, сейчас нет под рукой. Короче, я как-то юзерконтрол писал для трея. Привязка, ессно, к хвнд оного, а не формы. Поэтому убивается замечательно по факту закрытия программы без всякого гемора... Домой приду - выложу...
Или сам напиши, нетрудно :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 10.07.2003 (Чт) 10:59

Иконка продолжается работать?
Т.е. иногда бывает глюк, что иконку вроде бы удалили, но она не исчезла. Обычно исчезает при наведении мышки. :roll:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Сообщение Vitaliy » 11.07.2003 (Пт) 15:44

Ура!!! Нашел!!!
Кому интересно - фрагмент кода:
Код: Выделить всё
Declarations:
.............
Public Const PROCESS_TERMINATE = &H1
Public Const WM_QUERYENDSESSION = &H11
.............
.............
Public Sub KillProcess(ByVal hwnd As Long)
Dim pID As Long
Dim hProc As Long
GetWindowThreadProcessId hwnd, pID
hProc = OpenProcess(PROCESS_TERMINATE, False, pID)
Call SendMessage(hwnd, WM_QUERYENDSESSION, 0, 1)
TerminateProcess hProc, 0
CloseHandle hProc
End Sub


Таким образом удаляется и иконка из трея без всяких дополнительных манипуляций с треем.
P.S. Почему-то это работает только с тем из моих приложений, с которым я "боролся". На другие почему-то не действует :(

STING
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 19.06.2003 (Чт) 17:20

Сообщение STING » 11.07.2003 (Пт) 16:17

Загадочная душа Windows...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.07.2003 (Пт) 16:22

Ты ему (процессу) говоришь, что щас будешь мочить гад :)
Вот он и начинает выгружаться и первым делом сам удаляет значок из трея. А потом ты его мочишь. Т.е. значок удаляет не твой код, а сам тот процесс, который ты убиваешь. Другие программы видимо удаляют значок на другие события (возможно, не WM_QUERYENDSESSION, а WM_ENDSESSION).
Lasciate ogni speranza, voi ch'entrate.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 13.07.2003 (Вс) 10:09

А мож сообщение окну на выход слать?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 15

    TopList