Форум » [x]Harbour » Пара вопросов » Ответить

Пара вопросов

Dima: Xharbour , консоль. 1. Как узнать загружено ли определенное 16 битное приложение ? 2. Крутится фоновая задача на Xharbour , пользователь жмет ПУСК-ПЕРЕЗАГРУЗКА (ВЫКЛЮЧЕНИЕ) , как узнать что была дана такая команда ? Нужно для того что бы корректно завершить задачу.

Ответов - 9

Петр: Если приложение создает окно, самый простой способ FindWindow. В момент когда пользователь нажимает ПУСК-ПЕРЕЗАГРУЗКА, Windows посылает всем запущенным приложениям системное сообщение WM_забыл точно какое . Вот его в приложении надо перехватить и обработать соответствующим образом. Вот как это применить в консольной Xharbour программе - не знаю и никогда не задумывался.

Dima: Спасибо дружище , буду копать в этом направлении !!!

saulius: WM_забыл точно какое WM_ENDSESSION ?


Dima: Петр пишет: Вот его в приложении надо перехватить и обработать соответствующим образом Как это реализовать ? Спасибо !

Петр: saulius пишет: WM_ENDSESSION ? Сначала WM_QUERYENDSESSION

Петр: Dima пишет: Как это реализовать ? Обработчик на окно, хук на окно или процесс (недавно о таком спрашивали). Заморочек много с консолью. Может быть MiniGUI используешь, повесишь прогу в трей, использование собственного обработчика реализуется легко. А так можно - но нужно покодить и в основном на С.

gfilatov: Петр пишет: Может быть MiniGUI используешь, повесишь прогу в трей Ниже готовое приложение в качестве отправной точки: /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2002-2007 Roberto Lopez <harbourminigui@gmail.com> * * Copyright 2002-2007 Grigory Filatov <gfilatov@freemail.ru> */ ANNOUNCE RDDSYS #include "minigui.ch" #define WM_CLOSE 0x0010 #define WM_DESTROY 0x0002 #define PROGRAM 'CloseAll' #define COPYRIGHT ' Grigory Filatov, 2002-2007' #define VERSION ' version 1.2' STATIC hIcon, lAsk2Save := .t., lTrayTasks := .f., lShutDown := .f. *--------------------------------------------------------* Function Main *--------------------------------------------------------* SET MULTIPLE OFF WARNING SET EVENTS FUNCTION TO MYEVENTS hIcon := LoadTrayIcon( GetInstance(), "SHUT" ) DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 0 HEIGHT 0 ; TITLE PROGRAM ; MAIN NOSHOW ; NOTIFYICON 'MAIN' ; NOTIFYTOOLTIP PROGRAM + ": Right Click for Menu" ; ON NOTIFYCLICK CloseApps( _HMG_MainHandle ) ; ON RELEASE DestroyIcon( hIcon ) DEFINE NOTIFY MENU ITEM '&Shutdown Windows' ACTION {|| lShutDown := !lShutDown, ; Form_1.Shutdown.Checked := lShutDown } NAME Shutdown ITEM 'Add &Tray tasks' ACTION {|| lTrayTasks := !lTrayTasks, ; Form_1.TrayTasks.Checked := lTrayTasks } NAME TrayTasks ITEM '&Ask to save' ACTION {|| lAsk2Save := !lAsk2Save, ; Form_1.AskSave.Checked := lAsk2Save } NAME AskSave CHECKED SEPARATOR ITEM '&Mail to author...' ACTION ShellExecute(0, "open", "rundll32.exe", ; "url.dll,FileProtocolHandler " + ; "mailto:gfilatov@freemail.ru?cc=&bcc=" + ; "&subject=Close%20All%20Feedback" + ; "&body=How%20are%20you%2C%20Grigory%3F", , 1) ITEM 'A&bout...' ACTION ShellAbout( "About " + PROGRAM + "#", ; PROGRAM + VERSION + CRLF + Chr(169) + COPYRIGHT, hIcon ) SEPARATOR ITEM 'E&xit' ACTION Form_1.Release END MENU END WINDOW ACTIVATE WINDOW Form_1 Return Nil #define GW_HWNDFIRST 0 #define GW_HWNDLAST 1 #define GW_HWNDNEXT 2 #define GW_HWNDPREV 3 #define GW_OWNER 4 #define GW_CHILD 5 *--------------------------------------------------------* Function CloseApps( hOwnWnd ) *--------------------------------------------------------* LOCAL aWindows := {}, cTitle := "", iWindow LOCAL hWnd := GetWindow( hOwnWnd, GW_HWNDFIRST ) // Get the first window Form_1.NotifyIcon := "PRESSED" SysWait() WHILE hWnd != 0 // Loop through all the windows cTitle := GetWindowText( hWnd ) IF GetWindow( hWnd, GW_OWNER ) = 0 .AND.; // If it is an owner window IsWindowVisible( hWnd ) .AND.; // If it is a visible window hWnd != hOwnWnd .AND.; // If it is not this app !EMPTY( cTitle ) .AND.; // If the window has a title !( "DOS Session" $ cTitle ) .AND.; // If it is not DOS session !( cTitle == "Program Manager" ) // If it is not the Program Manager AADD( aWindows, hWnd ) ENDIF hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO if lTrayTasks hWnd := GetWindow( hOwnWnd, GW_HWNDFIRST ) WHILE hWnd != 0 // Loop through all the windows cTitle := GetWindowText( hWnd ) IF GetWindow( hWnd, GW_OWNER ) = 0 .AND.; // If it is an owner window !IsWindowVisible( hWnd ) .AND.; // If it is a visible window hWnd != hOwnWnd .AND.; // If it is not this app !EMPTY( cTitle ) .AND.; // If the window has a title !( "MS_" $ cTitle ) .AND.; // If it is not System apps !( "DDE" $ cTitle ) .AND.; // If it is not System apps !( "SYSTEM" $ cTitle ) .AND.; // If it is not System apps !( "SENS" $ cTitle ) .AND.; // If it is not System apps !( "WIN95" $ cTitle ) .AND.; // If it is not System apps !( "Spooler" $ cTitle ) .AND.; // If it is not System apps !( "Thread" $ cTitle ) .AND.; // If it is not System apps !( "DOS Session" $ cTitle ) .AND.; // If it is not DOS session !( cTitle == "Program Manager" ) // If it is not the Program Manager AADD( aWindows, hWnd ) ENDIF hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO endif FOR EACH iWindow IN aWindows PostMessage( iWindow, IF(lAsk2Save, WM_CLOSE, WM_DESTROY), 0, 0 ) // Close the window DO EVENTS NEXT SysWait() Form_1.NotifyIcon := "MAIN" if lShutDown WinExit() endif Return Nil *--------------------------------------------------------* Procedure SysWait( nWait ) *--------------------------------------------------------* Local iTime := Seconds() DEFAULT nWait TO .15 REPEAT DO EVENTS UNTIL Seconds() - iTime < nWait Return #define EWX_LOGOFF 0 #define EWX_SHUTDOWN 1 #define EWX_REBOOT 2 #define EWX_FORCE 4 #define EWX_POWEROFF 8 *--------------------------------------------------------* Procedure WinExit *--------------------------------------------------------* if IsWinNT() EnablePermissions() endif if ! ExitWindows(EWX_SHUTDOWN, 0) ShowError() endif Return #define WM_QUERYENDSESSION 0x0011 #define WM_ENDSESSION 0x0016 *--------------------------------------------------------* Function MyEvents( hWnd, nMsg, wParam, lParam ) *--------------------------------------------------------* do case case nMsg == WM_QUERYENDSESSION if ! lShutDown lAsk2Save := .t. lTrayTasks := .t. Set InteractiveClose Off DEFINE WINDOW Splash ; AT 0,0 ; WIDTH 350 HEIGHT 100 ; CHILD NOCAPTION ; TOPMOST ; MINWIDTH 350 ; MINHEIGHT 100 ; MAXWIDTH 350 ; MAXHEIGHT 100 ; ON INIT CloseApps( _HMG_MainHandle ) ; ON PAINT DrawIcon( GetFormHandle("Splash"), 18, 18, hIcon ) ; FONT 'MS Sans Serif' ; SIZE 9 DRAW PANEL IN WINDOW Splash ; AT 0, 0 ; TO Splash.Height-2*GetBorderHeight(), Splash.Width-2*GetBorderWidth() DRAW PANEL IN WINDOW Splash ; AT 1, 1 ; TO Splash.Height-2*GetBorderHeight()-1, Splash.Width-2*GetBorderWidth()-1 @ 32,85 LABEL Label_1 VALUE "Accelerating, please wait..." AUTOSIZE ; FONT 'Tahoma' ; SIZE 12 @ 75,85 LABEL Label_2 VALUE PROGRAM + VERSION + ' ' + Chr(169) + COPYRIGHT AUTOSIZE END WINDOW CENTER WINDOW Splash ACTIVATE WINDOW Splash NOWAIT endif Return 1 case nMsg == WM_ENDSESSION if IsWindowDefined( Splash ) Splash.Release() endif Return 1 otherwise Events ( hWnd, nMsg, wParam, lParam ) endcase Return 0 #pragma BEGINDUMP #define HB_OS_WIN_32_USED #define _WIN32_WINNT 0x0400 #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC ( SHOWERROR ) { LPVOID lpMsgBuf; DWORD dwError = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCSTR)lpMsgBuf, "Shutdown", MB_OK | MB_ICONEXCLAMATION); // Free the buffer LocalFree( lpMsgBuf ); } HB_FUNC( ENABLEPERMISSIONS ) { LUID tmpLuid; TOKEN_PRIVILEGES tkp, tkpNewButIgnored; DWORD lBufferNeeded; HANDLE hdlTokenHandle; HANDLE hdlProcessHandle = GetCurrentProcess(); OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hdlTokenHandle); LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tmpLuid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = tmpLuid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hdlTokenHandle, FALSE, &tkp, sizeof(tkpNewButIgnored), &tkpNewButIgnored, &lBufferNeeded); } HB_FUNC( EXITWINDOWS ) { hb_retl( ExitWindowsEx( (UINT) hb_parni( 1 ), (DWORD) hb_parnl( 2 ) ) ); } HB_FUNC( DRAWICON ) { HWND hWnd = (HWND) hb_parnl( 1 ); HDC hDC; hDC = GetDC( hWnd ); hb_retl( DrawIcon( (HDC) hDC, hb_parni( 2 ), hb_parni( 3 ), (HICON) hb_parnl( 4 ) ) ); ReleaseDC( hWnd, hDC ); } HB_FUNC( DESTROYICON ) { DestroyIcon( (HICON) hb_parnl( 1 ) ); } #pragma ENDDUMP

Dima: gfilatov Спасибо !

Pasha: Раньше в xHarbour gtapi была поддержка функции SetGtCloseHandler() Но в новом gtapi ее нет



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