powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с процессами
31 сообщений из 31, показаны все 2 страниц
Помогите разобраться с процессами
    #38382010
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть задача по кнопке из программы выполнить другой ехе (например bank.exe), но если он уже открыт в фоне, то при повторном нажатии на эту же кнопку поднять уже открытый bank.exe а не запускать еще одну копию. Полагаю что надо просто сканировать процессы на входжение имени. Знаю что уже обсуджалось, но найти не могу, ткните носом пожалуйста.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382034
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашел на форуме текст, немного его переделал чтобы в массив писать результат, теперь бы зная id процесса запустить его
автор#Define PROCESS_VM_READ 16
#Define PROCESS_QUERY_INFORMATION 1024
#Define BUF_SIZE 4096
#Define MAX_FILENAME_LEN 255
Declare Integer EnumProcesses In psapi String @ lpidProcess, Integer cb, Integer @ cbNeeded
Declare Integer OpenProcess In kernel32 Integer dwDesiredAccessas, Integer bInheritHandle, Integer dwProcId
Declare Integer OpenProcess In kernel32 Integer dwDesiredAccessas, Integer bInheritHandle, Integer dwProcId
Declare Integer GetModuleFileNameEx In psapi Integer hProcess, Integer hModule, String ModuleName, Integer nSize
Declare Integer CloseHandle In kernel32 Integer lhProcess
Local lcProcListBuf, i, lnBytesReturned, lnPID, lhProcess, lcProcFilenameBuf
lcProcListBuf = Replicate(Chr(0), BUF_SIZE)
lnBytesReturned = 0
DIMENSION aProcess(1)
nnn=0
If EnumProcesses(@lcProcListBuf, BUF_SIZE, @lnBytesReturned) != 0
For i = 1 To lnBytesReturned / 4
lnPID = BUF2DWORD(Substr(lcProcListBuf, 4 * (i - 1) + 1, 4))
lcProcFilenameBuf = padr("<Unknown>", MAX_FILENAME_LEN, Chr(0))
lnFileNameLen = 9
lhProcess = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, 0, lnPID)
If lhProcess <> 0
nnn=nnn+1
lnFileNameLen = GetModuleFileNameEx(lhProcess, 0, @lcProcFilenameBuf, MAX_FILENAME_LEN)
= CloseHandle(lhProcess)
DIMENSION aProcess(nnn,3)
aProcess(nnn,1)=lnPID
aProcess(nnn,2)=lhProcess
aProcess(nnn,3)=lcProcFilenameBuf
Endif
* ? Left(lcProcFilenameBuf, lnFileNameLen)
Endfor
Endif
SUSPEND

Function BUF2DWORD
Lparameters tcBuf
Return Asc(Substr(tcBuf, 1,1)) + ;
ASC(Substr(tcBuf, 2,1)) * 256 + ;
ASC(Substr(tcBuf, 3,1)) * 65536 + ;
ASC(Substr(tcBuf, 4,1)) * 16777216
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382054
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.Есть задача по кнопке из программы выполнить другой ехе (например bank.exe), но если он уже открыт в фоне, то при повторном нажатии на эту же кнопку поднять уже открытый bank.exe а не запускать еще одну копию. Полагаю что надо просто сканировать процессы на входжение имени. Знаю что уже обсуджалось, но найти не могу, ткните носом пожалуйста.

Как вывести приложение на передний план
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382064
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Там по заголовку окна вывод, а не по имени файла или по номеру процесса, уже читал.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382107
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.Там по заголовку окна вывод, а не по имени файла или по номеру процесса, уже читал.

Это тоже читал?
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382113
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, не прокатило
мне просто нужна команда где я могу указать pid процесса, там вода одна.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382207
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.да, не прокатило
мне просто нужна команда где я могу указать pid процесса, там вода одна.
Правильно понимаю: pid процесса ты знаешь и хочешь вывести его окно на передний план. Так?
Если так, то не все просто: процесс может иметь любое количество окон, может ни одного. Т.е. можно однозначно получить какому процессу принадлежит окно, а не наоборот.
С помощью EnumWindows() можно перебрать все окна, но из фокса эта функция не заработает, т.к. там callback фунция передается в параметрах, а на фоксе такую не написать.

Простейший способ найти по заголовку окна.

Еще вариант: после запуска проверять какое окно сейчас активно GetForegroundWindow() Как изменится - значит это окно запущенной проги. Дальше его хранить.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382515
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по заголовку никак если программа свернута
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382549
Дед Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй испльзовать Виндовые библиотеки. Вот код из моей программы, которая ищет программу по заголовку окна, и если нашла ее, выводит на передний план.

DECLARE INTEGER FindWindow IN win32api STRING, STRING
DECLARE INTEGER SetForegroundWindow IN USER32 INTEGER
m_hwnd1 = findwindow(0,"<Заголовок искомой программы>")
IF m_hwnd1 > 0
setforegroundwindow(m_hwnd1)
= MESSAGEBOX("Зачем запускать программу втрой раз, если она уже запущена?",0048, "Прошрамма", 7800)
QUIT
ENDIF
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382552
Дед Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй испльзовать Виндовые библиотеки. Вот код из моей программы, которая ищет программу по заголовку окна, и если нашла ее, выводит на передний план.

DECLARE INTEGER FindWindow IN win32api STRING, STRING
DECLARE INTEGER SetForegroundWindow IN USER32 INTEGER
m_hwnd1 = findwindow(0,"<Заголовок искомой программы>")
IF m_hwnd1 > 0
setforegroundwindow(m_hwnd1)
= MESSAGEBOX("Зачем запускать программу втрой раз, если она уже запущена?",0048, "Программа", 7800)
QUIT
ENDIF
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382644
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но из свернутого вида не поднимает, просто сообщение вываливает. Пока поставлю Ваш вариант, может еще будут какие-то советы. Реально нужная фишка же не только мне.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38382664
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.по заголовку никак если программа свернута
А. С.Спасибо, но из свернутого вида не поднимает, просто сообщение вываливает. Пока поставлю Ваш вариант, может еще будут какие-то советы. Реально нужная фишка же не только мне.
Ты определись сначала в чем проблема: не находит окно или не поднимает свернутое. Это разные задачи.

Попробуй так:
Код: sql
1.
ShowWindow(m_hwnd1, 5)


может не 5, поиграйся с разными флагами. Список тут , 5 это SW_SHOW

Чтоб вывести окно перед окном твоей проги:
Код: sql
1.
SetWindowPos(_vfp.hWnd, m_hwnd1, 0, 0, 0, 0, 3)
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38383876
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чего определяться? По моему задача кристально понятна. Запущенная фоновая программа может быть как развернута позади текущей, так и свернута. Мне просто нужно при нажатии на кнопку в первой программе либо запустить вторую, если она еще не запущена, либо открыть вторую на передний план с любого состояния, если она уже открыта.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38384401
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.,

Ну если всё ясно - вперёд. Реализуй.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38385057
через WMI это все это можно сделать... поиск по WMI в помощь..
код, сделаный на коленке выглядит примерно так

loWMI = GetObject("winmgmts:" + "{impersonationLevel=impersonate}!\\.\root\cimv2")
loItems = loWMI.ExecQuery("Select * From Win32_Process")
FOR EACH loItem in loItems
IF loItem.Name = "bank.exe"
RETURN Item.ProcessID
ENDIF
ENDFOR
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38386912
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alextashk,

я не сказал что решение ясно, я написал что задача ясна, поэтому прошу помощи в реализации а не воды.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38386930
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КонецЦикла,

Спасибо, хороший пример для изучения нового, но это уже третий вариант вытаскивания PID, но не решения моей задачи именно по PID или по заголовку окна или названию программы развернуть ее на передний план.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38387221
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.прошу помощи в реализации а не воды.
Итого без воды я уже написал. Вода здесь , разбавь по вкусу.
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38387636
А. С.КонецЦикла,

Спасибо, хороший пример для изучения нового, но это уже третий вариант вытаскивания PID, но не решения моей задачи именно по PID или по заголовку окна или названию программы развернуть ее на передний план.

если тебе не возвращается идентификатор процесса (null или ещё как-то, как тебе угодно), то запускаешь этот процесс с помощью метода Create() класса Win32_Process:
objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process")
objClass.Create("bank.exe", Null, Null, PID)

WMI: управление процессами

если возвращается идентификатор процесса, то
SH = CreateObject("WScript.Shell")
SH.AppActivate(ProcessId)

можно выполнить нажатие какой-нибудь клавиши SH.SendKeys("{Enter}").... иногда полезно делать небольшие задержки WScript.Sleep(500)....

вобщем, алгоритм примерно такой...
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38387687
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверка на то, что программа уже запущена у меня сделана вот так:
В главном prg-шнике

DECLARE INTEGER OpenEvent IN kernel32 AS oe ;
integer a, integer b, String c

DECLARE INTEGER CreateEvent IN kernel32 AS ce ;
integer b1,integer b2,integer b3, String c1


IF NOT EMPTY(oe(1,0,"qqq"))
MESSAGEBOX('Программа уже запущена!',16,'Ошибка')
QUIT
ENDIF

ce(0,0,1,"qqq")

Где qqq - имя запускаемого экзешника
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38387946
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Общими усилиями проблема решена, парни, спасибо за помощь.
авторloWMI = GetObject("winmgmts:" + "{impersonationLevel=impersonate}!\\.\root\cimv2")
loItems = loWMI.ExecQuery("Select * From Win32_Process")
nPID=0
FOR EACH loItem in loItems
IF loItem.Name = "bank.exe"
nPID=LoItem.ProcessID
ENDIF
ENDFOR
IF nPID>0
SH = CreateObject("WScript.Shell")
SH.AppActivate(nPID)
SH.SendKeys("%+{Enter}")
RELEASE SH
ENDIF
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38387950
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немного ужал
авторloWMI = GetObject("winmgmts:" + "{impersonationLevel=impersonate}!\\.\root\cimv2")
loItems = loWMI.ExecQuery("Select * From Win32_Process")
FOR EACH loItem in loItems
IF loItem.Name = "bank.exe"
SH = CreateObject("WScript.Shell")
SH.AppActivate(LoItem.ProcessID)
SH.SendKeys("%+{Enter}")
RELEASE SH
ENDIF
ENDFOR
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38387999
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в книге В.Клепинина описано более 3-х вариантов, в том числе (юзаю сама) поиск процесса по заголовку.
ну и все варианты - на передний план, свернуть ... из любого состояния и мн.другое
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38388014
рабы были вам помочь ))

только, если у тебя процесс bank.exe должен быть один, то зачем тогда после первого же успешного выполнения условия IF продолжать дальше в цикле перебирать все процессы? делай выход из цикла...
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38388122
б/л/я очепятка раДы были вам помочь конечно же )))
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38390745
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новая проблема. На сервере в терминалах работают несколько юзеров. Данный метод находит первый попавшийся bank.exe другого юзера. Надо теперь еще и имя юзера как-то учесть.
loItems = loWMI.ExecQuery("Select * From Win32_Process") - туда возвращаются имена пользователя? Я не могу найти как его вытащить.
loItems.csname вытаскиваем имя компа
есть метод в Win32_Process - getowner, но не пому как работает и то ли это что мне надо....
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38391840
В цикле делаешь проверку
NameOfUser = ""
ErrorCode = loItem.GetOwner(NameOfUser)
IF ErrorCode <> 0
значит какая-то ошибка, коды ошибок:
0
Successful Completion
2
Access Denied
3
Insufficient Privilege
8
Unknown Failure
9
Path Not Found
21
Invalid Parameter
ELSE
WAIT WINDOW NameOfUser
ENDIF
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38392511
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, помогли очень. Полный текст такой (анализ ошибок не делал, т.к. он не нужен)
авторloWMI = GetObject("winmgmts:" + "{impersonationLevel=impersonate}!\\.\root\cimv2")
loItems = loWMI.ExecQuery("Select * From Win32_Process where Name='bank.exe'")
LocShe = CreateObject("WScript.Shell")
nPID=0
FOR EACH loItem in loItems
IF UPPER(loItem.Name) = "BANK.EXE" &&Проверка на всякий случай
NameOfUser = ""
ErrorCode = loItem.GetOwner(NameOfUser)
IF ErrorCode=0 AND ALLTRIM(UPPER(NameOfUser))=ALLTRIM(UPPER(ALLTRIM(SUBSTR(SYS(0),AT('#',SYS(0))+1))))
nPID=LoItem.ProcessID
LocShe.AppActivate(nPID)
LocShe.SendKeys("%+{Enter}")
ENDIF
ENDIF
ENDFOR
IF nPID=0
LocShe.Run('bank.exe',3,0)
ENDIF
RELEASE LocShe
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38393361
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новый день принес новую проблему. Когда идет запуск в RDP из под админксой учетки - все нормально, сам все проверил - успокоился. Юзеры утром пришли - не запускается.
на строке
ErrorCode = loItem.GetOwner(NameOfUser)
пишет "ole exception error: exception code c0000005 object may be corrupt"
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38393452
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вместо
NameOfUser = ""
ErrorCode = loItem.GetOwner(NameOfUser)
делаю
PUBLIC NameOfUser
ErrorCode = loItem.GetOwner(NameOfUser)
то возвращает ответ ErrorCode = 2 - то есть нет доступа и NameOfUser = .T.

но когда ставлю NameOfUser = "" - то вышеуказанная ошибка возникает
...
Рейтинг: 0 / 0
Помогите разобраться с процессами
    #38393519
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, добил, немного костылями, но работает, выделенное жирным - изменения
loWMI = GetObject("winmgmts:" + "{impersonationLevel=impersonate}!\\.\root\cimv2")
loItems = loWMI.ExecQuery("Select * From Win32_Process where Name='bank.exe'")
LocShe = CreateObject("WScript.Shell")
nPID=0
FOR EACH loItem in loItems
IF UPPER(loItem.Name) = "BANK.EXE"
PUBLIC NameOfUser
NameOfUser = ""
OLEerror=0
ON ERROR OLEerror=1
ErrorCode = loItem.GetOwner(NameOfUser)
ON ERROR

IF OLEerror=0 AND ErrorCode=0 AND ALLTRIM(UPPER(NameOfUser))=ALLTRIM(UPPER(ALLTRIM(SUBSTR(SYS(0),AT('#',SYS(0))+1))))
nPID=LoItem.ProcessID
LocShe.AppActivate(nPID)
LocShe.SendKeys("%+{Enter}")
ENDIF
RELEASE NameOfUser
ENDIF
ENDFOR
IF nPID=0
LocShe.Run('bank.exe')
ENDIF
RELEASE LocShe
Дело в том, что юзеру нет доступа к чужим процессам, я просто скипаю ошибки
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с процессами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]