Foxpro доступ к окнам запущенных процессов и как завершить запущенные процессы - PullRequest
0 голосов
/ 28 апреля 2011

Как получить список диспетчера задач, выполняющих процессы в Foxpro 9, и как я могу уничтожить один из этих процессов в списке в FoxPro?

Ответы [ 2 ]

0 голосов
/ 01 мая 2011

Использование WMI делает это легко.Существует пример реализации завершения процесса с использованием WIN32_Process при http://www.berezniker.com/content/pages/visual-foxpro/check-if-exe-running-and-optionally-terminate-it, который также можно легко адаптировать для вывода списка процессов.

0 голосов
/ 29 апреля 2011

Вот функция для уничтожения всех видимых экземпляров конкретной программы. Вам нужно знать его ClassName. Мне удалось найти ClassNames для обычных приложений (например, приложений Office), выполнив поиск:

FUNCTION KillApp
*==============================================================================
* Program:              KillApp.PRG
* Purpose:              Close any invisible instances of a specified program
* Author:               Tamar E. Granor
* Last revision:            04/16/02
* Parameters:           tcClassName - the classname of the app to close
* Returns:              Number of instances closed; -1, if parameter problems
* Environment in:       
* Environment out:      Several API functions declared
*==============================================================================
#DEFINE GW_CHILD 5
#DEFINE GW_HWNDNEXT 2
#DEFINE WM_CLOSE 0x10 

LPARAMETERS tcClassName

ASSERT VARTYPE(tcClassName) = "C" AND NOT EMPTY(tcClassName) ;
    MESSAGE "KillApp: Must pass class name of application to kill"

IF VARTYPE(tcClassName) <> "C" OR EMPTY(tcClassName)
    ERROR 11
    RETURN -1
ENDIF

DECLARE LONG GetDesktopWindow IN WIN32API 
DECLARE LONG GetWindow IN WIN32API LONG hWnd, LONG wCmd
DECLARE LONG IsWindowVisible IN WIN32API LONG hWnd
DECLARE LONG GetClassName IN WIN32API LONG hWnd, STRING lpClassName, LONG nMaxCount 
DECLARE LONG PostMessage IN WIN32API LONG hwnd, LONG wMsg, LONG wParam, LONG lParam 

LOCAL lnDesktopHWnd, lnHWnd, lnOldHWnd, lcClass, lnLen, nClosedCount

lnDesktopHWnd = GetDesktopWindow()
lnHWnd = GetWindow( lnDesktopHWnd, GW_CHILD)
lnClosedCount = 0

DO WHILE lnHWnd <> 0
    lcClass = SPACE(256)
    lnLen = GetClassName( lnHWnd, @lcClass, 256)
    lnOldHWnd = lnHWnd
    lnHWnd = GetWindow(lnOldHWnd, GW_HWNDNEXT)
    IF UPPER(LEFT(lcClass, lnLen)) = UPPER(tcClassName)
        lnVisible = IsWindowVisible(lnOldHWnd)
        IF lnVisible = 0
            PostMessage( lnOldHWnd, WM_CLOSE, 0, 0)
            lnClosedCount = lnClosedCount + 1 
        ENDIF 
    ENDIF 
ENDDO

RETURN lnClosedCount

Просто понял, что процесс может не совпадать с приложением. Похоже, что API-функцией для поиска процессов является EnumProcesses. Проверить http://www.news2news.com/vfp/?group=-1&function=246.

Тамар

...