Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать hWnd процесса?

478
05 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Моя прога работает как процесс...
...как я могу получить ее hWnd?
258
05 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
Моя прога работает как процесс...
...как я могу получить ее hWnd?



Сначала надо определиться с понятиями...

обычно под hWnd понимают - дескриптор окна.
У процеса есть pID - идентификатор процесса и
pHandle - дескриптор процесса

Соответственно каждое окно имеет hWnd и связано с процессом его запустившим, который характеризуется pID и pHandle

Тебе что надо?

478
05 декабря 2003 года
XtreamAll
279 / / 01.10.2003
:D Да, протупил, с этим я еще путаюсь...

Выходит таки Handle...
Вобщем мне нужно принудительно прекратить процесс...
...как это лучше сделать?

Нашел варианты:

Private Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long

Private Declare Function CloseServiceHandle Lib "advapi32.dll" Alias "CloseServiceHandle" (ByVal hSCObject As Long) As Long

что эти функции принимают и какая подходит к моему случаю?
258
05 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
CloseHandle помойму всего лишь освобождает дескриптор...

Вообще для закрытия программ используют обычно другие функции, например пишут так:

Код:
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Const PROCESS_ALL_ACCESS = 0

Dim exitCode as Long

exitCode =0
 ' запустили свой дочерний процесс - программу иначе говоря
 pID = Shell("c:\windows\notepad.exe", vbNormalFocus)
' зная pID процесса находим pHandle процесса
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)
TerminateProcess(myProcess, exitCode)
' освобождаем дескриптор
CloseHandle(pHandle)


Только как я недавно узнал, такой принудительный способ (а этим способом можно принудительно закрыть почти любую программу, естественно с потерей всех ее данных, потому как принудитено) оказывается не освобождает память из под используемых этой программой Dll и COM объектов, что не очень хорошо... хотя все пользуются, наверное надеются на win'ский диспетчер памяти, наверное он в состоянии разобраться с таким барахлом, по крайне мере в Xp... но все уже мои догадки

Более умные функции закрытия программы, обычно сначала работают через окно (hWnd), посылая ему команду о закрытии, тогда окно может закончить все свои дела и закрыться, а вот если оно например через 15 сек еще назакрылось (зависло там или очень сильно задумалось), то тогда уже принудительно через Terminate.

Код посылки сообщения окну программы о закрытии могу написать... а тебя есть окно у программы-то?
478
05 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Неее...
Окна пока нету...
Начальнику надо, чтобы работало уже сегодня...
...а прога серьезная, успел сделать только "ядро", до окошек руки еще не дошли...

так эта прога иногда отказывается после завершения работы уничтожаться...
...в этом случае надо ее убить принудительно...
...к сожалению баг искать пока некогда:devil:
478
05 декабря 2003 года
XtreamAll
279 / / 01.10.2003
TerminateProcess(myProcess, exitCode)

Что такое myProcess?
258
05 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
TerminateProcess(myProcess, exitCode)

Что такое myProcess?



Извиняй, очепятка, вместо myProcess надо писать pHandle

простой старый кусок переделывал под наши обсуждаемые обозначения...

478
05 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Насчет "очепятки" я догадался, а спросил т.к. не работало...
Так (pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)), pHandle=0
...а вот так:

Public Declare Function GetCurrentProcess Lib "kernel32" Alias "GetCurrentProcess" () As Long

pHandle=GetCurrentProcess()...

все получилось!

:)

пасибо!
258
05 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
Насчет "очепятки" я догадался, а спросил т.к. не работало...
Так (pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)), pHandle=0
...а вот так:

Public Declare Function GetCurrentProcess Lib "kernel32" Alias "GetCurrentProcess" () As Long

pHandle=GetCurrentProcess()...

все получилось!

:)

пасибо!



Ну, с GetCurrentProcess конечно все пойдет, он же возвращает текущий процесс, просто не так часто свой же текущий процесс.

258
05 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
А так, для эксперимента, можешь попробовать место PROCESS_ALL_ACCESS вбить в функцию OpenProcess такое значение &H100000
478
05 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Я это понимаю, поэтому отлавливаю pHandle=GetCurrentProcess при старте...
...конечно OpenProcess было-бы лучше, но к сожалению не работает...
...может есть какой-нибудь GetProcess(pID)?
478
05 декабря 2003 года
XtreamAll
279 / / 01.10.2003
С помощью &H100000 я что то потушил...
...но явно не то, что надо:D
258
05 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог