Функция is_run32 была написана в свете проблем определения активности приложения. Конечно существует API функция FindWindow, которая как раз для этого и служит, но у нее есть большие недоработки.
Функция is_run32 была написана в свете проблем определения активности приложения. Конечно
существует API функция FindWindow, которая как раз для этого и служит, но у нее есть большие
недоработки.
Вообще,FindWind служит для определения активности окна, а не приложения, но это понятия достаточно
близкие, поэтому она используется и для определения активности окна, и для определения активности
приложения.
Но FindWindows требует указания полного заголовка окна или имени класса. А множество приложений
имеют динамический заголовок (например отражающий имя открытого файла). И ко всему прочему, эта
функция чувствительна к регистру. Имя класса также определеяется нелегко: функция API GetClassName
требует указания хэндла (handle) окна, который может меняться.
Is_run32 использует функции API для своей работы. Если приложение запущено, то функция возвращает
хэндл окна. Если приложение не запущено, то функция возвращает ноль.
Как использовать:
Is_run32 работает только с 32-битными приложениями Windows. Для ее использования, просто передайте
известную часть заголовка окна в функцию:
handle=Is_run32('word')
**** IS_RUN32.prg
LPARAMETER pctitle
DECLARE INTEGER GetActiveWindow IN Win32API
DECLARE INTEGER GetWindow IN Win32API;
INTEGER hwnd, INTEGER dflag
DECLARE INTEGER GetWindowText IN Win32API ;
INTEGER hwnd, STRING @lptstr, INTEGER cbmax
LOCAL lnhwnd, lnnext, lldone, lctitle_bar, lcsearchfor,;
lntext_len
lcsearchfor = UPPER(ALLTRIM(pctitle))
lnhwnd = GetActiveWindow()
lnnext = 2
lldone = .F.
lctitle_bar = ""
DO WHILE NOT lldone
IF NOT EMPTY(lnhwnd)
lctitle_bar = SPACE(200) + CHR(0)
lntext_len = GetWindowText(lnhwnd, @lctitle_bar, 200)
lctitle_bar = UPPER(LEFT(lctitle_bar, lntext_len))
lldone = (lcsearchfor $ lctitle_bar)
IF NOT lldone
lnhwnd = GetWindow(lnhwnd, lnnext)
ENDIF
ELSE
lldone = .T.
ENDIF
ENDDO
RETURN lnhwnd
******************************************
Proc My_RUN32 && проще образца
******************************************
LPARAMETER pctitle
LOCAL lnhwnd,nhwnd
DECLARE INTEGER GetWindowText IN Win32API ;
INTEGER hwnd, STRING @lptstr, INTEGER
pctitle=UPPER(pctitle)
lnhwnd = 0
FOR nhwnd=1 TO 9000
lptstr=SPAC(200)+CHR(0)
=GetWindowText(nhwnd,@lptstr,LEN(lptstr))
IF pctitle $ upper(lptstr)
lnhwnd = nhwnd
EXIT
ENDIF
NEXT
RETURN lnhwnd
Мазуренко Владимир
21.11.01 22:41:52
Пусть у нас есть программа Альфа.
В зависимости от режима ее запуска в заголовке окна должны появляться разные слова, например
"Пользователь Петров, Быстрый режим, Программа Альфа".
(Такие жесткие требования Заказчика!)
При следующем запуске этой же программы (тот же exe-файл и та же база данных), скажем, в заголовке
должно быть:
"Пользователь Иванов, Средний режим, Программа Альфа".
Заголовки разные, программа и база данных одна и та же.
Повторный запуск, естественно, не желателен.
Есть ли на такой случай готовые решения?
Мазуренко Владимир. kluch-mm@korolev.net.ru
Игорь Викторович Лопатин
24.05.04 21:56:27
А ты попробуй - обе программы найдут и то и другое :)