Форум » GUI » ShellExecuteEx ? Есть ли такая функция ? » Ответить

ShellExecuteEx ? Есть ли такая функция ?

Andrey: Привет FiveWin-цам ! Есть ли у вас в FiveWin функция ShellExecuteEx() ? А то стандартная ShellExecute() не устраивает.... По доке ShellExecuteEx() возращает PID окна. Как получить хендл из него ? Это удобно для запоминания какие файлы открыл у себя в программе, чтобы потом чужие файлы не закрыть....

Ответов - 4

Dima: Andrey пишет: Есть ли у вас в FiveWin функция ShellExecuteEx() ? А она откуда ? Из Harbour , Minigui ? Судя по всему она живет в unicows.lib и ты снова спутал тапочки с кедами.

santy: Использования функции ShellExecuteEx есть в примере minigui samples\advanced\FileMan\FileMan.prg Примеры использования на RSDN http://www.rsdn.ru/article/qna/baseserv/progexec.xml

Andrey: Dima пишет: снова спутал тапочки с кедами. Согласен.... Я потом только это увидел... santy пишет: Использования функции ShellExecuteEx есть в примере minigui samples\advanced\FileMan\FileMan.prg Да я видел этот пример, только не понял как его использовать. Вот сделал тест. /* * MINIGUI - Harbour Win32 GUI library * * ShellExecuteEx for MiniGui/ */ REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 ANNOUNCE RDDSYS #include "minigui.ch" PROCEDURE Main PUBLIC hWinExec := 0 SET LANGUAGE TO RUSSIAN SET CODEPAGE TO RUSSIAN DEFINE FONT font_0 FONTNAME 'Tahona' SIZE 16 BOLD DEFAULT DEFINE WINDOW wMain ; AT 0,0 WIDTH 450 HEIGHT 300 ; TITLE "Тест для ShellExecuteEx()" ; MAIN ; NOMAXIMIZE NOSIZE @ 50,100 BUTTONEX Button_1 ; WIDTH 230 HEIGHT 60 ; CAPTION 'ShellExecuteEx()' ; ACTION RunFile() @ 160,100 BUTTONEX Button_2 ; WIDTH 230 HEIGHT 60 ; CAPTION 'EXIT' ; ACTION { || CloseTask(), ThisWindow.Release } END WINDOW CENTER WINDOW wMain ACTIVATE WINDOW wMain RETURN //////////////////////////////////////////////////////////////////////////////// #define SW_SHOWNORMAL 1 // ShowWindow() Commands -> #include "winuser.h" #define SW_MAXIMIZE 3 FUNCTION RunFile() LOCAL xVal, xVal2, cFileRun LOCAL cPath := GetEnv( "MG_ROOT" ) cFileRun := cPath + "\Doc\MiniGUI.chm" IF FILE( cFileRun ) //xVal := ShellExecute( , 'open', cFileRun, , , SW_MAXIMIZE) xVal := ShellExecuteEx( , 'open', cFileRun, , , SW_MAXIMIZE) MsgDebug(xVal,"Как этот SHExecInfo.hProcess перевести в ХЕНДЛ окна ?") M->hWinExec := 0 // хендл окна запущенного MiniGUI.chm // Очень удобно получать ХЕНДЛ своего открытого документа .doc или .xls // чтобы потом его закрыть самостоятельно из программы. ELSE MsgStop("Not file: " + cFileRun) ENDIF RETURN NIL //////////////////////////////////////////////////////////////////////////////// // закрыть по ХЕНДЛУ открытые задачи #define WM_CLOSE 0x0010 #define WM_DESTROY 0x0002 FUNCTION CloseTask() LOCAL hWndTask IF M->hWinExec > 0 PostMessage( M->hWinExec, WM_CLOSE, 0, 0) ENDIF /* // запускаемые файлы *.chm на русском имеют титул окна "Справка" // смотреть http://clipper.borda.ru/?1-3-0-00000300-000-0-1-1404942263 // при поиске в памяти можно закрыть чужой хелп // закрыть по ХЕНДЛУ открытый файл помощи hWndTask := FindWindowEx(,,,"Справка" ) IF hWndTask > 0 PostMessage( hWndTask, WM_CLOSE, 0, 0) ENDIF */ RETURN NIL //////////////////////////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> /* HB_FUNC( GETDESKTOPWINDOW ) { hb_retnl( (LONG)GetDesktopWindow() ); } */ HB_FUNC( SHELLEXECUTEEX ) { SHELLEXECUTEINFO SHExecInfo; ZeroMemory(&SHExecInfo, sizeof(SHExecInfo)); SHExecInfo.cbSize = sizeof(SHExecInfo); SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; SHExecInfo.lpVerb = (LPCSTR) hb_parcx( 2 ); SHExecInfo.lpFile = (LPCSTR) hb_parcx( 3 ); SHExecInfo.lpParameters = (LPCSTR) hb_parcx( 4 ); SHExecInfo.lpDirectory = (LPCSTR) hb_parcx( 5 ); SHExecInfo.nShow = hb_parni(6); if (!ShellExecuteEx(&SHExecInfo)) { hb_retnl(NULL); } else { //HMODULE test = LoadLibrary("KERNEL32.DLL"); //lpGetProcessId GetProcessId = (LpGetProcessId) GetProcAdress(test, "GetInstanceId"); //MessageBox(0, (LPCSTR) GetProcAdress(text, "GetInstanceId"), "DLL ID", MB_OK); hb_retnl( (LONG) SHExecInfo.hProcess); } } #pragma ENDDUMP


Andrey: Сделал рабочий пример. Кому интересно, смотрите тут /* * MINIGUI - Harbour Win32 GUI library * * ShellExecuteEx() and TerminateProcess() for MiniGui * * WinBase.hon Windows XP, Windows Server 2003, Windows Vista, Windows 7, * Windows Server 2008, and Windows Server 2008 R2 (include Windows.h); * Processthreadsapi.h on Windows 8 and Windows Server 2012 */ ANNOUNCE RDDSYS #include "minigui.ch" STATIC hProcessHandleShellExecuteEx PROCEDURE Main DEFINE WINDOW wMain ; AT 0,0 WIDTH 450 HEIGHT 300 ; TITLE "Тест для ShellExecuteEx()" ; MAIN ; FONT "Tahona" SIZE 16 ; NOMAXIMIZE NOSIZE @ 20,100 BUTTONEX Button_1 ; WIDTH 230 HEIGHT 60 ; CAPTION 'ShellExecuteEx()' ; ACTION RunFile() @ 100,100 BUTTONEX Button_3 ; WIDTH 230 HEIGHT 60 ; CAPTION 'TerminateProcess()'; ACTION { || CloseProcess() } @ 180,100 BUTTONEX Button_2 ; WIDTH 230 HEIGHT 60 ; CAPTION 'EXIT' ; ACTION { || ThisWindow.Release } END WINDOW CENTER WINDOW wMain ACTIVATE WINDOW wMain RETURN //////////////////////////////////////////////////////////////////////////////// #define SW_SHOWNORMAL 1 // ShowWindow() Commands -> #include "winuser.h" FUNCTION RunFile() LOCAL xVal, xVal2, cFileRun LOCAL cPath := GetEnv( "MG_ROOT" ) // где находиться MiniGui cFileRun := cPath + "\Doc\MiniGUI.chm" IF FILE( cFileRun ) // хендл процесса (запущенный хелп MiniGUI.chm) hProcessHandleShellExecuteEx := ShellExecuteEx( , 'open', cFileRun, , , SW_SHOWNORMAL) // Очень удобно получать ХЕНДЛ своего открытого документа .doc или .xls // чтобы потом его закрыть самостоятельно из программы. ELSE MsgStop("Not file: " + cFileRun) ENDIF RETURN NIL //////////////////////////////////////////////////////////////////////////////// // закрыть по ХЕНДЛУ процесса открытую программу FUNCTION CloseProcess() IF hProcessHandleShellExecuteEx > 0 TerminateProcess( hProcessHandleShellExecuteEx ) ENDIF RETURN NIL //////////////////////////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( SHELLEXECUTEEX ) { SHELLEXECUTEINFO SHExecInfo; ZeroMemory(&SHExecInfo, sizeof(SHExecInfo)); SHExecInfo.cbSize = sizeof(SHExecInfo); SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; SHExecInfo.lpVerb = (LPCSTR) hb_parcx( 2 ); SHExecInfo.lpFile = (LPCSTR) hb_parcx( 3 ); SHExecInfo.lpParameters = (LPCSTR) hb_parcx( 4 ); SHExecInfo.lpDirectory = (LPCSTR) hb_parcx( 5 ); SHExecInfo.nShow = hb_parni(6); if (!ShellExecuteEx(&SHExecInfo)) { hb_retnl(NULL); } else { hb_retnl( (LONG) SHExecInfo.hProcess); } } HB_FUNC( TERMINATEPROCESS ) { hb_retnl( (BOOL) TerminateProcess( (HANDLE) hb_parni(1),0) ); } #pragma ENDDUMP



полная версия страницы