|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Есть задача по кнопке из программы выполнить другой ехе (например bank.exe), но если он уже открыт в фоне, то при повторном нажатии на эту же кнопку поднять уже открытый bank.exe а не запускать еще одну копию. Полагаю что надо просто сканировать процессы на входжение имени. Знаю что уже обсуджалось, но найти не могу, ткните носом пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 10:25 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
нашел на форуме текст, немного его переделал чтобы в массив писать результат, теперь бы зная 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 10:45 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А. С.Есть задача по кнопке из программы выполнить другой ехе (например bank.exe), но если он уже открыт в фоне, то при повторном нажатии на эту же кнопку поднять уже открытый bank.exe а не запускать еще одну копию. Полагаю что надо просто сканировать процессы на входжение имени. Знаю что уже обсуджалось, но найти не могу, ткните носом пожалуйста. Как вывести приложение на передний план ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 10:56 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Там по заголовку окна вывод, а не по имени файла или по номеру процесса, уже читал. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 11:02 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А. С.Там по заголовку окна вывод, а не по имени файла или по номеру процесса, уже читал. Это тоже читал? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 11:30 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
да, не прокатило мне просто нужна команда где я могу указать pid процесса, там вода одна. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 11:31 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А. С.да, не прокатило мне просто нужна команда где я могу указать pid процесса, там вода одна. Правильно понимаю: pid процесса ты знаешь и хочешь вывести его окно на передний план. Так? Если так, то не все просто: процесс может иметь любое количество окон, может ни одного. Т.е. можно однозначно получить какому процессу принадлежит окно, а не наоборот. С помощью EnumWindows() можно перебрать все окна, но из фокса эта функция не заработает, т.к. там callback фунция передается в параметрах, а на фоксе такую не написать. Простейший способ найти по заголовку окна. Еще вариант: после запуска проверять какое окно сейчас активно GetForegroundWindow() Как изменится - значит это окно запущенной проги. Дальше его хранить. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 12:29 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
по заголовку никак если программа свернута ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 15:34 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Попробуй испльзовать Виндовые библиотеки. Вот код из моей программы, которая ищет программу по заголовку окна, и если нашла ее, выводит на передний план. 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 15:59 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Попробуй испльзовать Виндовые библиотеки. Вот код из моей программы, которая ищет программу по заголовку окна, и если нашла ее, выводит на передний план. 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 16:00 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Спасибо, но из свернутого вида не поднимает, просто сообщение вываливает. Пока поставлю Ваш вариант, может еще будут какие-то советы. Реально нужная фишка же не только мне. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 16:59 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А. С.по заголовку никак если программа свернута А. С.Спасибо, но из свернутого вида не поднимает, просто сообщение вываливает. Пока поставлю Ваш вариант, может еще будут какие-то советы. Реально нужная фишка же не только мне. Ты определись сначала в чем проблема: не находит окно или не поднимает свернутое. Это разные задачи. Попробуй так: Код: sql 1.
может не 5, поиграйся с разными флагами. Список тут , 5 это SW_SHOW Чтоб вывести окно перед окном твоей проги: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2013, 17:14 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А чего определяться? По моему задача кристально понятна. Запущенная фоновая программа может быть как развернута позади текущей, так и свернута. Мне просто нужно при нажатии на кнопку в первой программе либо запустить вторую, если она еще не запущена, либо открыть вторую на передний план с любого состояния, если она уже открыта. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2013, 10:27 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А. С., Ну если всё ясно - вперёд. Реализуй. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2013, 16:59 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
через 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2013, 10:44 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
alextashk, я не сказал что решение ясно, я написал что задача ясна, поэтому прошу помощи в реализации а не воды. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2013, 16:19 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
КонецЦикла, Спасибо, хороший пример для изучения нового, но это уже третий вариант вытаскивания PID, но не решения моей задачи именно по PID или по заголовку окна или названию программы развернуть ее на передний план. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2013, 16:28 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А. С.прошу помощи в реализации а не воды. Итого без воды я уже написал. Вода здесь , разбавь по вкусу. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2013, 20:56 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
А. С.КонецЦикла, Спасибо, хороший пример для изучения нового, но это уже третий вариант вытаскивания 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).... вобщем, алгоритм примерно такой... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2013, 11:52 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Проверка на то, что программа уже запущена у меня сделана вот так: В главном 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 - имя запускаемого экзешника ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2013, 12:18 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Общими усилиями проблема решена, парни, спасибо за помощь. автор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 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2013, 14:25 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
немного ужал автор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 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2013, 14:29 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
в книге В.Клепинина описано более 3-х вариантов, в том числе (юзаю сама) поиск процесса по заголовку. ну и все варианты - на передний план, свернуть ... из любого состояния и мн.другое ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2013, 14:52 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
рабы были вам помочь )) только, если у тебя процесс bank.exe должен быть один, то зачем тогда после первого же успешного выполнения условия IF продолжать дальше в цикле перебирать все процессы? делай выход из цикла... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2013, 14:58 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
б/л/я очепятка раДы были вам помочь конечно же ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2013, 16:03 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Новая проблема. На сервере в терминалах работают несколько юзеров. Данный метод находит первый попавшийся bank.exe другого юзера. Надо теперь еще и имя юзера как-то учесть. loItems = loWMI.ExecQuery("Select * From Win32_Process") - туда возвращаются имена пользователя? Я не могу найти как его вытащить. loItems.csname вытаскиваем имя компа есть метод в Win32_Process - getowner, но не пому как работает и то ли это что мне надо.... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2013, 10:38 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
В цикле делаешь проверку 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2013, 10:50 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Спасибо, помогли очень. Полный текст такой (анализ ошибок не делал, т.к. он не нужен) автор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 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2013, 16:21 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Новый день принес новую проблему. Когда идет запуск в RDP из под админксой учетки - все нормально, сам все проверил - успокоился. Юзеры утром пришли - не запускается. на строке ErrorCode = loItem.GetOwner(NameOfUser) пишет "ole exception error: exception code c0000005 object may be corrupt" ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2013, 11:36 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Если вместо NameOfUser = "" ErrorCode = loItem.GetOwner(NameOfUser) делаю PUBLIC NameOfUser ErrorCode = loItem.GetOwner(NameOfUser) то возвращает ответ ErrorCode = 2 - то есть нет доступа и NameOfUser = .T. но когда ставлю NameOfUser = "" - то вышеуказанная ошибка возникает ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2013, 12:34 |
|
Помогите разобраться с процессами
|
|||
---|---|---|---|
#18+
Все, добил, немного костылями, но работает, выделенное жирным - изменения 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 Дело в том, что юзеру нет доступа к чужим процессам, я просто скипаю ошибки ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2013, 13:21 |
|
|
start [/forum/topic.php?all=1&fid=41&tid=1582918]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
267ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 315ms |
total: | 679ms |
0 / 0 |