Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с процессами / 25 сообщений из 31, страница 1 из 2
30.08.2013, 10:25
    #38382010
А. С.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
Есть задача по кнопке из программы выполнить другой ехе (например bank.exe), но если он уже открыт в фоне, то при повторном нажатии на эту же кнопку поднять уже открытый bank.exe а не запускать еще одну копию. Полагаю что надо просто сканировать процессы на входжение имени. Знаю что уже обсуджалось, но найти не могу, ткните носом пожалуйста.
...
Рейтинг: 0 / 0
30.08.2013, 10:45
    #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
30.08.2013, 10:56
    #38382054
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
А. С.Есть задача по кнопке из программы выполнить другой ехе (например bank.exe), но если он уже открыт в фоне, то при повторном нажатии на эту же кнопку поднять уже открытый bank.exe а не запускать еще одну копию. Полагаю что надо просто сканировать процессы на входжение имени. Знаю что уже обсуджалось, но найти не могу, ткните носом пожалуйста.

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

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

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

Еще вариант: после запуска проверять какое окно сейчас активно GetForegroundWindow() Как изменится - значит это окно запущенной проги. Дальше его хранить.
...
Рейтинг: 0 / 0
30.08.2013, 15:34
    #38382515
А. С.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
по заголовку никак если программа свернута
...
Рейтинг: 0 / 0
30.08.2013, 15:59
    #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
30.08.2013, 16:00
    #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
30.08.2013, 16:59
    #38382644
А. С.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
Спасибо, но из свернутого вида не поднимает, просто сообщение вываливает. Пока поставлю Ваш вариант, может еще будут какие-то советы. Реально нужная фишка же не только мне.
...
Рейтинг: 0 / 0
30.08.2013, 17:14
    #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
02.09.2013, 10:27
    #38383876
А. С.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
А чего определяться? По моему задача кристально понятна. Запущенная фоновая программа может быть как развернута позади текущей, так и свернута. Мне просто нужно при нажатии на кнопку в первой программе либо запустить вторую, если она еще не запущена, либо открыть вторую на передний план с любого состояния, если она уже открыта.
...
Рейтинг: 0 / 0
02.09.2013, 16:59
    #38384401
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
А. С.,

Ну если всё ясно - вперёд. Реализуй.
...
Рейтинг: 0 / 0
03.09.2013, 10:44
    #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
04.09.2013, 16:19
    #38386912
А. С.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
alextashk,

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

Спасибо, хороший пример для изучения нового, но это уже третий вариант вытаскивания PID, но не решения моей задачи именно по PID или по заголовку окна или названию программы развернуть ее на передний план.
...
Рейтинг: 0 / 0
04.09.2013, 20:56
    #38387221
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
А. С.прошу помощи в реализации а не воды.
Итого без воды я уже написал. Вода здесь , разбавь по вкусу.
...
Рейтинг: 0 / 0
05.09.2013, 11:52
    #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
05.09.2013, 12:18
    #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
05.09.2013, 14:25
    #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
05.09.2013, 14:29
    #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
05.09.2013, 14:52
    #38387999
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с процессами
в книге В.Клепинина описано более 3-х вариантов, в том числе (юзаю сама) поиск процесса по заголовку.
ну и все варианты - на передний план, свернуть ... из любого состояния и мн.другое
...
Рейтинг: 0 / 0
05.09.2013, 14:58
    #38388014
Помогите разобраться с процессами
рабы были вам помочь ))

только, если у тебя процесс bank.exe должен быть один, то зачем тогда после первого же успешного выполнения условия IF продолжать дальше в цикле перебирать все процессы? делай выход из цикла...
...
Рейтинг: 0 / 0
05.09.2013, 16:03
    #38388122
Помогите разобраться с процессами
б/л/я очепятка раДы были вам помочь конечно же )))
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с процессами / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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