Форум » [x]Harbour » Окно: Как убить и спрятать обратно его по Hand-лу ??? » Ответить

Окно: Как убить и спрятать обратно его по Hand-лу ???

SkyNET: Здравствуйте ! Как убить окно по его Handl ? И как можно окно сделать снова невидимым ??? Вот код: [more]#include "inkey.ch" FUNCTION MAIN() LOCAL aStart := {}, nI, aMenu:={}, aItems:={}, nSelect, cTemp LOCAL nSEL, cMess, aOpt cMess := "Выберите действие с этим процессом..." aOpt := {"Свернуть","Развернуть","Убить"} STRFILE("","Process.lst") aStart := GetWindowList() // Считать ХЕНДЛ окна и ИМЯ окна FOR nI:= 1 TO LEN(aStart) AADD( aMenu, { aStart[nI,1], HB_ANSITOOEM(aStart[nI,2]) } ) cTemp := STR(aStart[nI,1])+", "+HB_ANSITOOEM(aStart[nI,2]) AADD( aItems, cTemp ) STRFILE( cTemp+CHR(13)+CHR(10),"Process.lst",.T.) NEXT CLEAR SCREEN @ 1,7 SAY "Handl окна Название окна" COLOR("11/0") DO WHILE LastKey() <> K_ESC nSelect := Achoice( 2, 5, MaxRow()-2, 75, aItems, .T. ) IF nSelect <> 0 // ВЫБОР ДЕЙСТВИЯ nSEL := Alert(cMess,aOpt) DO CASE CASE nSEL == 1 MINIMIZE( aStart[nSelect,1] ) CASE nSEL == 2 // Display selected file MAXIMIZE( aStart[nSelect,1] ) CASE nSEL == 3 ????? ENDCASE KEYBOARD Chr(255) // sets Lastkey() to 255 Inkey() ENDIF ENDDO 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 GetWindowList() LOCAL aWindows := {}, cTitle := "" LOCAL hWnd := GetWindow( GetForegroundWindow(), GW_HWNDFIRST ) WHILE hWnd != 0 // Loop through all the windows if !empty(cTitle := GetWindowText( hWnd )) AADD( aWindows, {hWnd, upper(cTitle)} ) endif hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO return aWindows #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } HB_FUNC( GETFOREGROUNDWINDOW ) { hb_retnl( (LONG) GetForegroundWindow() ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } HB_FUNC( GETWINDOWTEXT ) { int iLen = SendMessage( (HWND) hb_parnl(1), WM_GETTEXTLENGTH, 0, 0 ) + 1; char *cText = ( char * ) hb_xgrab( iLen ); GetWindowText( (HWND) hb_parnl(1), (LPTSTR) cText, iLen ); hb_retc( cText ); hb_xfree( cText ); } HB_FUNC( GETWINDOW ) { hb_retnl( (LONG) GetWindow((HWND) hb_parnl(1), hb_parni(2)) ); } #pragma ENDDUMP [/more]

Ответов - 13

Sergey Spirin: SkyNET пишет: Как убить процесс по его Handl ? Так вам окно закрыть или процесс убить? По приведенному коду видно собрание хэндлов окон, но никак не процессов...

SkyNET: Извините, окно в смысле.... Вроде был плагин для Total Commander, который прятал и показывал невидимые окна... Так я делаю наподобие, чтобы еще и закрывал эти окна.

fil: Процесс сначала надо через WmiService получить


Sergey Spirin: SkyNET пишет: Извините, окно в смысле.... Вроде был плагин для Total Commander, который прятал и показывал невидимые окна... Спрятать/показать: ShowWindow(Wnd, SW_HIDE); ShowWindow(Wnd, SW_SHOW); Совсем убить: DestroyWindow(Wnd);

SkyNET: Спасибо, спрятать/показать работает, но DestroyWindow(Wnd) не работает. но ошибку не выдает... Добавлял: HB_FUNC( KKILL ) { DestroyWindow( (HWND) hb_parnl(1) ); }

fil: посылаешь окну VM_CLOSE

SkyNET: HB_FUNC( KKILL ) { DestroyWindow( (HWND) hb_parnl(1),VM_CLOSE() ); } Так ??? Error E2451 GETWINLIST.PRG 121: Undefined symbol 'VM_CLOSE' in function HB_FUN_KKILL Error E2227 GETWINLIST.PRG 121: Extra parameter in call to DestroyWindow in function HB_FUN_KKILL *** 2 errors in Compile ***

fil: #define VM_CLOSE 16 sendmessage(hWnd, VM_CLOSE)

SkyNET: Ммммм.... Error: Unresolved external '_sendmessage'

fil: тогда использовать апишную sendmessage

SkyNET: fil пишет: тогда использовать апишную sendmessage Это как ??

Loach: Не знаю, поможет или нет, но у меня работает так: SendMessage(hWnd, 16, 0, 0) И ИМЕННО SendMessage, а не sendmessage... Так у меня тоже Unresolved external...

SkyNET: Спасибо большое, всё работает... Вот полный рабочий код этой программы: #include "common.ch" #include "inkey.ch" FUNCTION MAIN() LOCAL aStart := {}, nI, aMenu:={}, aItems:={}, nSelect, cTemp LOCAL nSEL, cMess, aOpt cMess := "Выберите действие с этим процессом..." aOpt := {"Свернуть","Развернуть","Спрятать","Показать","Убить"} STRFILE("","Process.lst") aStart := GetWindowList() // Считать ХЕНДЛ окна и ИМЯ окна FOR nI:= 1 TO LEN(aStart) AADD( aMenu, { aStart[nI,1], HB_ANSITOOEM(aStart[nI,2]) } ) cTemp := STR(aStart[nI,1])+", "+HB_ANSITOOEM(aStart[nI,2]) AADD( aItems, cTemp ) STRFILE( cTemp+CHR(13)+CHR(10),"Process.lst",.T.) NEXT CLEAR SCREEN @ 1,7 SAY "Хенл окна Название окна" COLOR("11/0") DO WHILE LastKey() <> K_ESC nSelect := Achoice( 2, 5, MaxRow()-2, 75, aItems, .T. ) IF nSelect <> 0 // ВЫБОР ДЕЙСТВИЯ nSEL := Alert(cMess,aOpt) DO CASE CASE nSEL == 1 MINIMIZE( aStart[nSelect,1] ) CASE nSEL == 2 // Display selected file MAXIMIZE( aStart[nSelect,1] ) CASE nSEL == 3 HIDE( aStart[nSelect,1]) CASE nSEL == 4 SSHOW( aStart[nSelect,1]) CASE nSEL == 5 KKILL( aStart[nSelect,1]) ENDCASE KEYBOARD Chr(255) // sets Lastkey() to 255 Inkey() ENDIF ENDDO 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 GetWindowList() LOCAL aWindows := {}, cTitle := "" LOCAL hWnd := GetWindow( GetForegroundWindow(), GW_HWNDFIRST ) WHILE hWnd != 0 // Loop through all the windows if !empty(cTitle := GetWindowText( hWnd )) AADD( aWindows, {hWnd, upper(cTitle)} ) endif hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO return aWindows #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> #define VM_CLOSE 16 HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } HB_FUNC( GETFOREGROUNDWINDOW ) { hb_retnl( (LONG) GetForegroundWindow() ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } HB_FUNC( HIDE ) { ShowWindow( (HWND) hb_parnl(1), SW_HIDE ); } HB_FUNC( SSHOW ) { ShowWindow( (HWND) hb_parnl(1), SW_SHOW ); } HB_FUNC( KKILL ) { SendMessage( (HWND) hb_parnl(1), VM_CLOSE,0,0); //DestroyWindow( (HWND) hb_parnl(1), VM_CLOSE); } HB_FUNC( GETWINDOWTEXT ) { int iLen = SendMessage( (HWND) hb_parnl(1), WM_GETTEXTLENGTH, 0, 0 ) + 1; char *cText = ( char * ) hb_xgrab( iLen ); GetWindowText( (HWND) hb_parnl(1), (LPTSTR) cText, iLen ); hb_retc( cText ); hb_xfree( cText ); } HB_FUNC( GETWINDOW ) { hb_retnl( (LONG) GetWindow((HWND) hb_parnl(1), hb_parni(2)) ); } #pragma ENDDUMP



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