#include "kitty_win.h" // Modifie la transparence void SetTransparency( HWND hwnd, int value ) { #ifndef MOD_NOTRANSPARENCY SetLayeredWindowAttributes( hwnd, 0, value, LWA_ALPHA ) ; #endif } // Numéro de version de l'OS void GetOSInfo( char * version ) { // ==> Deprecated with version >= Windows 8.1 OSVERSIONINFO osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); sprintf( version, "%ld.%ld %ld %ld %s %dx%d", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber, osvi.dwPlatformId, osvi.szCSDVersion, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN) ) ; } /* http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832%28v=vs.85%29.aspx Operating system Version number Windows 10 Insider Preview 10.0* Windows Server Technical Preview 10.0* Windows Server 2019 10.0* Windows Server 2016 10.0* Windows 8.1 6.3* Windows Server 2012 R2 6.3* Windows 8 6.2 Windows Server 2012 6.2 Windows 7 6.1 Windows Server 2008 R2 6.1 Windows Server 2008 6.0 Windows Vista 6.0 Windows Server 2003 R2 5.2 Windows Server 2003 5.2 Windows XP 64-Bit Edition 5.2 Windows XP 5.1 Windows 2000 5.0 */ /* https://msdn.microsoft.com/en-us/library/aa383745%28v=vs.85%29.aspx#faster_builds_with_smaller_header_files Minimum system required Minimum value for _WIN32_WINNT and WINVER Windows 8.1 _WIN32_WINNT_WINBLUE (0x0602) Windows 8 _WIN32_WINNT_WIN8 (0x0602) Windows 7 _WIN32_WINNT_WIN7 (0x0601) Windows Server 2008 _WIN32_WINNT_WS08 (0x0600) Windows Vista _WIN32_WINNT_VISTA (0x0600) Windows Server 2003 with SP1, Windows XP with SP2 _WIN32_WINNT_WS03 (0x0502) Windows Server 2003, Windows XP _WIN32_WINNT_WINXP (0x0501) Minimum version required Minimum value of _WIN32_IE Internet Explorer 10.0 _WIN32_IE_IE100 (0x0A00) Internet Explorer 9.0 _WIN32_IE_IE90 (0x0900) Internet Explorer 8.0 _WIN32_IE_IE80 (0x0800) Internet Explorer 7.0 _WIN32_IE_IE70 (0x0700) Internet Explorer 6.0 SP2 _WIN32_IE_IE60SP2 (0x0603) Internet Explorer 6.0 SP1 _WIN32_IE_IE60SP1 (0x0601) Internet Explorer 6.0 _WIN32_IE_IE60 (0x0600) Internet Explorer 5.5 _WIN32_IE_IE55 (0x0550) Internet Explorer 5.01 _WIN32_IE_IE501 (0x0501) Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE_IE50 (0x0500) */ typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL IsWow64() { BOOL bIsWow64 = FALSE; //IsWow64Process is not available on all supported versions of Windows. //Use GetModuleHandle to get a handle to the DLL that contains the function //and GetProcAddress to get a pointer to the function if available. fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if(NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) { //handle error } } return bIsWow64 ; } int OpenFileName( HWND hFrame, char * filename, char * Title, char * Filter ) { char * szTitle = Title ; char szFilter[256] ; strcpy( szFilter, Filter ) ; // on remplace les caractères '|' par des caractères NULL. int i = 0; while(i < sizeof(szFilter) && szFilter[i] != '\0') { if(szFilter[i] == '|') szFilter[i] = '\0'; i++; } // boîte de dialogue de demande d'ouverture de fichier //char szFileName[_MAX_PATH + 1] = ""; char * szFileName = filename ; szFileName[0] = '\0' ; OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hFrame; ofn.lpstrFilter = szFilter; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; //ofn.nMaxFile = sizeof(szFileName); ofn.nMaxFile = 4096 ; ofn.lpstrTitle = szTitle; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_EXTENSIONDIFFERENT | OFN_DONTADDTORECENT ; // si aucun nom de fichier n'a été sélectionné, on abandonne if(!GetOpenFileName(&ofn)) { return 0 ; } else { return 1 ; } } int SaveFileName( HWND hFrame, char * filename, char * Title, char * Filter ) { char * szTitle = Title ; char szFilter[256] ; strcpy( szFilter, Filter ) ; // on remplace les caractères '|' par des caractères NULL. int i = 0; while(i < sizeof(szFilter) && szFilter[i] != '\0') { if(szFilter[i] == '|') szFilter[i] = '\0'; i++; } // boîte de dialogue de demande d'ouverture de fichier //char szFileName[_MAX_PATH + 1] = ""; char * szFileName = filename ; szFileName[0] = '\0' ; OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hFrame; ofn.lpstrFilter = szFilter; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; //ofn.nMaxFile = sizeof(szFileName); ofn.nMaxFile = 4096 ; ofn.lpstrTitle = szTitle; ofn.lpstrDefExt = ".ktx" ; ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_EXTENSIONDIFFERENT | OFN_DONTADDTORECENT ; // si aucun nom de fichier n'a été sélectionné, on abandonne if(!GetSaveFileName(&ofn)) { return 0 ; } else { return 1 ; } } #include int OpenDirName( HWND hFrame, char * dirname ) { BROWSEINFO bi ; ITEMIDLIST *il ; LPITEMIDLIST ol = NULL ; char Buffer[4096],Result[4096]="" ; dirname[0]='\0' ; strcpy( Buffer, getenv("ProgramFiles") ) ; //SHGetSpecialFolderLocation( hFrame, CSIDL_MYDOCUMENTS, &ol ); memset(&bi,0,sizeof(BROWSEINFO)); bi.hwndOwner = hFrame ; //bi.pidlRoot=NULL ; // bi.pidlRoot=ol ; bi.pszDisplayName=&Buffer[0]; bi.lpszTitle="Select a folder..."; bi.ulFlags=0; bi.lpfn=NULL; if ((il=SHBrowseForFolder(&bi))!=NULL) { SHGetPathFromIDList(il,&Result[0]) ; //ILFree( il ) ; ILFree( ol ) ; GlobalFree(il);GlobalFree(ol); if( strlen( Result ) == 0 ) return 0 ; strcpy( dirname, Result ) ; return 1 ; } //ILFree( ol ) ; GlobalFree(ol); return 0 ; } // Centre un dialog au milieu de la fenetre parent void CenterDlgInParent(HWND hDlg) { RECT rcDlg; HWND hParent; RECT rcParent; MONITORINFO mi; HMONITOR hMonitor; int xMin, yMin, xMax, yMax, x, y; GetWindowRect(hDlg,&rcDlg); hParent = GetParent(hDlg); GetWindowRect(hParent,&rcParent); hMonitor = MonitorFromRect(&rcParent,MONITOR_DEFAULTTONEAREST); mi.cbSize = sizeof(mi); GetMonitorInfo(hMonitor,&mi); xMin = mi.rcWork.left; yMin = mi.rcWork.top; xMax = (mi.rcWork.right) - (rcDlg.right - rcDlg.left); yMax = (mi.rcWork.bottom) - (rcDlg.bottom - rcDlg.top); if ((rcParent.right - rcParent.left) - (rcDlg.right - rcDlg.left) > 20) x = rcParent.left + (((rcParent.right - rcParent.left) - (rcDlg.right - rcDlg.left)) / 2); else x = rcParent.left + 70; if ((rcParent.bottom - rcParent.top) - (rcDlg.bottom - rcDlg.top) > 20) y = rcParent.top + (((rcParent.bottom - rcParent.top) - (rcDlg.bottom - rcDlg.top)) / 2); else y = rcParent.top + 60; SetWindowPos(hDlg,NULL,max(xMin,min(xMax,x)),max(yMin,min(yMax,y)),0,0,SWP_NOZORDER|SWP_NOSIZE); } // // Envoi vers l'imprimante // // Parametres de l'impression int PrintCharSize = 100 ; int PrintMaxLinePerPage = 60 ; int PrintMaxCharPerLine = 85 ; int PrintText( const char * Text ) { int return_code = 0 ; PRINTDLG pd; DOCINFO di; int i, TextLen = 0, Index1 = 0, Index2 = 2; //int Exit = 0 ; char* LinePrint = NULL ; char* szMessage = NULL ; if( Text == NULL ) return 1 ; if( strlen( Text ) == 0 ) return 1 ; memset (&pd, 0, sizeof(PRINTDLG)); memset (&di, 0, sizeof(DOCINFO)); di.cbSize = sizeof(DOCINFO); di.lpszDocName = "Test"; pd.lStructSize = sizeof(PRINTDLG); pd.Flags = PD_PAGENUMS | PD_RETURNDC; pd.nFromPage = 1; pd.nToPage = 1; pd.nMinPage = 1; pd.nMaxPage = 1; szMessage = 0; if( PrintDlg( &pd ) ) { if( pd.hDC ) { if (StartDoc (pd.hDC, &di) != SP_ERROR) { TextLen = strlen( Text ) ; if( TextLen > 0 ) { LinePrint = (char*) malloc( TextLen + 2 ) ; Index1 = 0 ; Index2 = 2 ; //Exit = 0 ; for( i = 0 ; i < TextLen ; i++ ) { if( Text[i]=='\r' ) i++; LinePrint[Index1] = Text[i] ; if( Text[i] == '\n' ) { Index2++ ; LinePrint[Index1] = '\0' ; TextOut(pd.hDC,100, Index2*PrintCharSize, LinePrint, strlen(LinePrint) ) ; Index1 = 0 ; } else if( Index1>=PrintMaxCharPerLine ) { Index2++ ; LinePrint[Index1+1] = '\0' ; TextOut(pd.hDC,100, Index2*PrintCharSize, LinePrint, strlen(LinePrint) ) ; Index1 = 0 ; } else { Index1++ ; } if( Index2 >= PrintMaxLinePerPage ) { EndPage( pd.hDC ) ; //EndDoc(pd.hDC) ; //StartDoc(pd.hDC, &di) ; StartPage( pd.hDC ) ; Index2 = 2 ; } } Index2++ ; LinePrint[Index1] = '\0'; // Impression de la dernière page TextOut(pd.hDC,100, Index2*PrintCharSize, LinePrint, strlen(LinePrint)) ; EndPage(pd.hDC) ; EndDoc(pd.hDC) ; szMessage = "Print successful"; free( LinePrint ) ; } else { return_code = 1 ; /* Chaine vide */ } } else { // Problème StartDoc szMessage = "ERROR Type 1" ; return_code = 2 ; } } else { // Probleme pd.hDC szMessage = "ERROR Type 2." ; return_code = 3 ; } } else { // Problème PrintDlg //szMessage = "Impression annulée par l'utilisateur" ; return_code = 4 ; } if (szMessage) { MessageBox (NULL, szMessage, "Print report", MB_OK) ; } return return_code ; } // Impression du texte dans le bloc-notes void ManagePrint( HWND hwnd ) { char *pst = NULL ; if( OpenClipboard(NULL) ) { HGLOBAL hglb ; if( (hglb = GetClipboardData( CF_TEXT ) ) != NULL ) { if( ( pst = GlobalLock( hglb ) ) != NULL ) { PrintText( pst ) ; GlobalUnlock( hglb ) ; } } CloseClipboard(); } } // Met un texte dans le press-papier int SetTextToClipboard( const char * buf ) { HGLOBAL hglbCopy ; LPTSTR lptstrCopy ; if( !IsClipboardFormatAvailable(CF_TEXT) ) return 0 ; if( !OpenClipboard(NULL) ) return 0 ; EmptyClipboard() ; if( (hglbCopy= GlobalAlloc(GMEM_MOVEABLE, (strlen(buf)+1) * sizeof(TCHAR)) ) == NULL ) { CloseClipboard() ; return 0 ; } lptstrCopy = GlobalLock( hglbCopy ) ; memcpy( lptstrCopy, buf, (strlen(buf)+1) * sizeof(TCHAR) ) ; GlobalUnlock( hglbCopy ) ; if( SetClipboardData(CF_TEXT, hglbCopy) == NULL ) { CloseClipboard() ; return 0 ; } CloseClipboard() ; return 1 ; } // Execute une commande void RunCommand( HWND hwnd, const char * cmd ) { PROCESS_INFORMATION ProcessInformation ; ZeroMemory( &ProcessInformation, sizeof(ProcessInformation) ); STARTUPINFO StartUpInfo ; ZeroMemory( &StartUpInfo, sizeof(StartUpInfo) ); StartUpInfo.cb=sizeof(STARTUPINFO); StartUpInfo.lpReserved=0; StartUpInfo.lpDesktop=0; StartUpInfo.lpTitle=0; StartUpInfo.dwX=0; StartUpInfo.dwY=0; StartUpInfo.dwXSize=0; StartUpInfo.dwYSize=0; StartUpInfo.dwXCountChars=0; StartUpInfo.dwYCountChars=0; StartUpInfo.dwFillAttribute=0; StartUpInfo.dwFlags=0; StartUpInfo.wShowWindow=0; StartUpInfo.cbReserved2=0; StartUpInfo.lpReserved2=0; StartUpInfo.hStdInput=0; StartUpInfo.hStdOutput=0; StartUpInfo.hStdError=0; //MessageBox(hwnd,cmd,"Info",MB_OK); if( !CreateProcess(NULL,(CHAR*)cmd,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartUpInfo,&ProcessInformation) ) { ShellExecute(hwnd, "open", cmd ,0 , 0, SW_SHOWDEFAULT); } else { WaitForInputIdle(ProcessInformation.hProcess, INFINITE ); CloseHandle( &StartUpInfo ); CloseHandle( &ProcessInformation ); } } void RunPuttyEd( HWND hwnd, char * filename ) { char buffer[1024]="", shortname[1024]="" ; if( GetModuleFileName( NULL, (LPTSTR)buffer, 1023 ) ) if( GetShortPathName( buffer, shortname, 1023 ) ) { strcat( shortname, " -ed" ); if( filename!=NULL ) if( strlen(filename)>0 ) { strcat( shortname, "b " ) ; strcat( shortname, filename ) ; } debug_logevent( shortname ) ; RunCommand( hwnd, shortname ) ; } } // Verifie si une mise a jour est disponible sur le site web extern char BuildVersionTime[256] ; void CheckVersionFromWebSite( HWND hwnd ) { char buffer[1024]="", vers[1024]="" ; int i ; strcpy( vers, BuildVersionTime ) ; for( i = 0 ; i < strlen( vers ) ; i ++ ) { if( !(((vers[i]>='0')&&(vers[i]<='9'))||(vers[i]=='.')) ) { vers[i] = '\0' ; break ; } } sprintf( buffer, "http://www.9bis.net/kitty/check_update.php?version=%s", vers ) ; ShellExecute(hwnd, "open", buffer, 0, 0, SW_SHOWDEFAULT); } // Affichage d'un message dans l'event log void debug_logevent( const char *fmt, ... ) { va_list ap; char *buf; va_start(ap, fmt); buf = dupvprintf(fmt, ap) ; va_end(ap); do_eventlog(buf) ; free(buf); } // Test si un chemin est absolu bool IsPathAbsolute( const char * path ) { bool test = false ; if( path == NULL ) { return false ; } if( strlen( path ) < 3 ) { return false ; } if( ((path[0]>='a') && (path[0]<='z')) || ((path[0]>='A') && (path[0]<='Z')) ) if( path[1]==':' ) if( (path[2]=='/') || (path[2]=='\\') ) test = true ; return test ; } void PopUpSystemMenu( HWND hwnd, int npos ) { RECT rc ; GetWindowRect( hwnd, &rc ) ; HMENU m = GetSystemMenu( hwnd, FALSE) ; TrackPopupMenu( m, 0, rc.left, rc.top, 0, hwnd, NULL) ; if( npos>0 ) { int nb = GetMenuItemCount(m), i; MENUITEMINFO mi ; mi.cbSize = sizeof(MENUITEMINFO) ; for( i=0; i