FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9239
Вход
Запущено-ли приложение ?

Функция is_run32 была написана в свете проблем определения активности приложения. Конечно существует API функция FindWindow, которая как раз для этого и служит, но у нее есть большие недоработки.


 
Прислал: VFC   Категория: Foxpro и другие приложения


Запущено-ли приложение ?

Функция 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


 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.974)
Дополнения пользователей
Запущено-ли приложение ?
[+][?]
Andrey
24.05.01 06:25:04

******************************************
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

А ты попробуй - обе программы найдут и то и другое :)
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика