lundi 29 juin 2015

Programme de transfert Photo / Vidéo Mutli Caméra (Mise à jour)

http://informatique-prog-ef.blogspot.com/2015/06/programme-de-transfert-photo-video_29.html

J'ai modifié le programme pour permettre de sélectionner les dates à transférer.  Il y a aussi une nouvelle section qui permet de visualiser les "Thumbnail" des photos/vidéos qui sont présents dans les dates sélectionnées.  Pour pouvoir créer les "Thumbnail" des vidéos, j'utilise FFmpeg qui était déjà utilisé pour la conversion.

Voir la page: https://trac.ffmpeg.org/wiki/Create%20a%20thumbnail%20image%20every%20X%20seconds%20of%20the%20video




mardi 23 juin 2015

Visual Studio SQLite

https://nickcharlton.net/posts/sqlite-with-csharp.html

http://swinbrain.ict.swin.edu.au/wiki/Create_a_SQLite_Database

Programme de transfert Photo / Vidéo Mutli Caméra

Je possède une caméra Sony HDRXR260V et le logiciel de transfert qui vient avec celle-ci est très lent pour transférer les vidéos de la caméra, car il convertit les vidéo avant de les transférer et le tout ce fait par USB.  Je trouvais ceci très inefficace, l'autre façon de fonctionner était d'aller manuellement chercher les vidéos par l'explorateur Windows mais encore là j'obtenais un problème dû au fait que je devais créer l'arborescence manuellement (classer par date).  J'en suis venu à la conclusion de créer mon programme de transfert de média et par le fait même transférer les photos/vidéo de n'importe quel marque de caméra

J'ai programmé le tout avec Visual Studio 2012 Express en C#.  L'interface est très simple et très de base.



On peut choisir le device que l'on veut et les options qui ont été pré-configurés.  Lorsqu'on choisit l'appareil, le périphérique USB associé à l'appareil est détecté et la lettre du lecteur s'affiche dans l'indicateur et on peut ensuite débuter le transfert. Le programme va identifié les fichiers à transférer sous le dossier source, créer une arborescence par date(AAAA-MM-JJ) dans le dossier de destination, toutes les photos/Vidéo qui ont été prises la même date se retrouvent dans le même dossier de destination.   Il y a donc un classement qui se fait en même temps.  J'ai inclus un programme crc32.exe qui permet de vérifier que les checksum du fichier source et de destination sont semblables. Une option de 2ième dossier de backup est disponible.  Dans le cas de vidéo, il est possible de convertir ceux-ci avec ffmpeg avec une ligne de commande configurable et les vidéos convertis sont enregistrés dans un dossier de destination.

La conclusion est que ce petit programme me permet de sauver énormément de temps.   Certaines fonctions ne sont pas encore codé: "Transférer seulement les récentes" et "Tranférer et Supprimer".  Cependant, pour ce qui est de la première, il y a une validation qui est fait avant de copier le fichier à savoir si celui-ci existe déjà dans le dossier de destination, si c'est le cas le fichier n'est pas recopié mais le checksum est quand même validé.

Vu que le tout est développé avec la version Express de Visual Studio, selon la licence, je ne peux pas publier le code source (Selon ce que j'ai lu... je peux p-ê me tromper).

Guide programmation WPF

http://www.wpftutorial.net/WPFIntroduction.html

http://www.codeproject.com/Articles/23772/WPF-A-Beginner-s-Guide-Part-of-n

Unity Site différent type de Camera

http://code.tutsplus.com/tutorials/unity3d-third-person-cameras--mobile-11230

Reconaissance Facial

OPENCVdotNET

https://code.google.com/p/opencvdotnet/


http://friism.com/facedectection-in-c-with-less-than-50-loc

SQLite Password

http://stackoverflow.com/questions/1381264/password-protect-a-sqlite-db-is-it-possible
 
 
SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.open();
then next time you can access it like
conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();
This wont allow any GUI editor to view Your data.
Later if you wish to change the password, use
conn.ChangePassword("new_password");
To reset or remove password, use
conn.ChangePassword(String.Empty);

Unity3D A* PathFinding error CS0241

Il faut changer la configuration de la version du .Net Framework




HTTP GET avec Visual C#

http://stackoverflow.com/questions/943852/how-to-send-an-https-get-request-in-c-sharp

visual c# int à une chaîne de caractère avec une longueur fixe.

http://stackoverflow.com/questions/6399771/string-format-in-net-convert-integer-to-fixed-width-string

Input gamepad

http://www.codeproject.com/Articles/185522/Using-the-Raw-Input-API-to-Process-Joystick-Input

Visual C# Joystick Input

http://msdn.microsoft.com/en-us/library/windows/desktop/bb153251%28v=vs.85%29.aspx

SlimDx

http://slimdx.org/

ActiveX Dev

http://www.codeproject.com/Articles/24089/Create-ActiveX-in-NET-Step-by-Step

http://www.codeproject.com/Articles/1256/Exposing-Windows-Forms-Controls-as-ActiveX-control

http://www.codeproject.com/Articles/14533/A-Complete-ActiveX-Web-Control-Tutorial

http://stackoverflow.com/questions/3360160/how-do-i-create-an-activex-com-in-c

http://www.mrrives.com/Technology/?p=767

http://www.digitallycreated.net/Blog/38/using-makecert-to-create-certificates-for-development

http://msdn.microsoft.com/en-us/library/aa231196%28v=vs.60%29.aspx

http://surfthenetsafely.com/ieseczone3.htm

http://msdn.microsoft.com/en-us/library/aewdt4xt%28v=vs.90%29.aspx

http://blogs.msdn.com/b/winsdk/archive/2009/11/13/steps-to-sign-a-file-using-signtool-exe.aspx

C++ Liste des fenêtres ouvertes dans la session

 #include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <vector>
#include <string>
#include <ShellAPI.h>

 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

...

EnumWindows(EnumWindowsProc, NULL);

....

std::string progtitle("Notepad.exe");

    GetClassNameA(hwnd3,class_name, sizeof(class_name));
    GetWindowTextA(hwnd3,title,sizeof(title));

    std::string wintitle(title);
    //std::string classname(class_name);
       
    if(wintitle.find(progtitle) != std::string::npos)
    {
        bTitleFound = TRUE;
        wintitleglb = wintitle;

        //MessageBoxA(0, classname.c_str(), "MessageBox caption", MB_OK);
       
        HWND iHandle = FindWindowA("TabThumbnailWindow", wintitle.c_str());

        if(iHandle)
        {
            SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
        }
        else
        {
            iHandle = FindWindowA("IEFrame", wintitle.c_str());
            if(iHandle)
            {
                SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
            }

        }

    }

    return TRUE;
}

C++ Démarre une application à partir d'un Service

Le service démarre avec l'usager System Local donc pour démarrer une application au nom de l'usager il faut démarrer celle-ci avec CreateProcessAsUser.  Il faut aller chercher le token de l'usager dans la session console active.

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <vector>
#include <string>
#include <ShellAPI.h>
#include <userenv.h>
#include <winnt.h>
#include <WtsApi32.h>
#include <process.h>

HANDLE currentToken = 0;
HANDLE primaryToken = 0;

int dwSessionId = 0;
HANDLE hUserToken = 0;
HANDLE hTokenDup = 0;

PWTS_SESSION_INFO pSessionInfo = 0;
DWORD dwCount = 0;

    //Get User Token
    WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwCount);
   
    int dataSize = sizeof(WTS_SESSION_INFO);

    for (DWORD i = 0; i < dwCount; ++i)
    {
        WTS_SESSION_INFO si = pSessionInfo[i];
        if (WTSActive == si.State)
        {
            dwSessionId = si.SessionId;
            break;
        }
    }

    WTSFreeMemory(pSessionInfo);

    BOOL bRet = WTSQueryUserToken(dwSessionId, &currentToken);
    int errorcode = GetLastError();
    if(bRet == false)
    {
        bLoggedUser = false;
    }
    else
    {
        bLoggedUser = true;
    }
   
    bRet = DuplicateTokenEx(currentToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 0, SecurityImpersonation, TokenPrimary, &primaryToken);
    errorcode = GetLastError();

    if (bRet == false)
    {
         //return 0;
    }
    if (primaryToken == 0)
    {
       
    }
   
   
    STARTUPINFO StartupInfo = {0};
    PROCESS_INFORMATION processInfo;
    StartupInfo.cb = sizeof(STARTUPINFO);

    STARTUPINFO si = { sizeof(STARTUPINFO) };
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    PROCESS_INFORMATION pi;

LPVOID pEnvironment = NULL;

bRet = CreateEnvironmentBlock(&pEnvironment, primaryToken, TRUE);
    if (!bRet) {
        //hr = GetLastError();
        //return hr;
    }

.....
CreateProcessAsUser(primaryToken,L"c:\\application.exe",NULL, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT , pEnvironment, NULL,  &si, &pi);   


 DestroyEnvironmentBlock(pEnvironment);
 CloseHandle(primaryToken);
 CloseHandle(currentToken);
 CloseHandle( pi.hThread );  
 CloseHandle( pi.hProcess );


C++ Vérifier si on Process est déjà démarré

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <vector>
#include <string>
#include <ShellAPI.h>
#include <userenv.h>
#include <winnt.h>
#include <WtsApi32.h>
#include <process.h>

DWORD aProcesses[1024], cbNeeded, cProcesses;
HANDLE hProcess;
bool bProcRunning = false;WCHAR filename[260];
wcscpy(filename, L"Application.exe");
bool bLoggedUser;

HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof (pEntry);
BOOL hRes = Process32First(hSnapShot, &pEntry);


while (hRes)
                {
                    if (wcscmp(pEntry.szExeFile, filename)==0)
                    {
                        bProcRunning=true;
                        if( bLoggedUser == false)
                        {
                            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,(DWORD) pEntry.th32ProcessID);
                            if (hProcess != NULL)
                            {
                                TerminateProcess(hProcess, 9);
                                CloseHandle(hProcess);
                               
                            }
                        }
                    }
                    hRes = Process32Next(hSnapShot, &pEntry);
                }
                CloseHandle(hSnapShot);

Visual C# Effacer tout les éléments d'une liste

listBox_SelectStation.Items.Clear();

Visual C# Enlever des éléments de la liste

ArrayList SelectedItems = new ArrayList(listBox_SelectStation.SelectedItems);

foreach (var selectitem in SelectedItems)
{
         listBox_SelectStation.Items.Remove(selectitem);
}

Visual C# Énumérer fichier dans un dossier et remplir une liste avec ceci

foreach (var filepath in Directory.EnumerateFiles(path))
{
                comboBox_StationFile.Items.Add(filepath.Replace("path to remove",""));
}

Visual C# vérification de l'existence d'un fichier ou répertoire

Fichier:
 if(File.Exists(string_Path+ "config.ini"))

Répertoire
 if(Directory.Exists(string_Path))

Visual C# lire un fichier

using (StreamReader sr = File.OpenText(textFile))
{
        
         while ((compare = sr.ReadLine()) != null)
         {

                       code;

         }

}

Visual C# écrire une ligne dans un fichier

using (StreamWriter sw = File.CreateText(string_command))
{
             sw.WriteLine(string_line);
 }

Visual C# lancement d'un ligne de commande avec fenêtre cachée.

Process p = new Process();

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = string_command;
p.Start();

p.WaitForExit(); // Attend la fin de l'exécution avant de continuer dans le code

NetBeans Java exécuter un programme.exe ou une ligne de commande

Pour exécuter une ligne de commande, voici comment faire:

File destDir = jFileChooser_Dest.getCurrentDirectory();
       
        String del_cmd = "cmd /c rmdir /S /Q " + destDir;
        String create_cmd= "cmd /c mkdir " + destDir;
        
        try{
                    
            Process rt = Runtime.getRuntime().exec(del_cmd);
           
            StreamGobbler errorGobbler = new  
            StreamGobbler(rt.getErrorStream(), "ERROR");             
             
            // any output? 
            StreamGobbler outputGobbler = new  
            StreamGobbler(rt.getInputStream(), "OUTPUT"); 
                 
            // kick them off 
            errorGobbler.start(); 
            outputGobbler.start();
          
            rt.waitFor();
            //Process pr = rt.exec();
          
        }catch (IOException ex){        
            //jTextField_Statut.setText(ex.toString());
            Logger.getLogger(MedFilm_MainView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(MedFilm_MainView.class.getName()).log(Level.SEVERE, null, ex);
        }
       
        try{
                    
            Process rt = Runtime.getRuntime().exec(create_cmd);
           
            StreamGobbler errorGobbler = new  
            StreamGobbler(rt.getErrorStream(), "ERROR");             
             
            // any output? 
            StreamGobbler outputGobbler = new  
            StreamGobbler(rt.getInputStream(), "OUTPUT"); 
                 
            // kick them off 
            errorGobbler.start(); 
            outputGobbler.start();
          
            rt.waitFor();
            //Process pr = rt.exec();
          
        }catch (IOException ex){        
            //jTextField_Statut.setText(ex.toString());
            Logger.getLogger(MedFilm_MainView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(MedFilm_MainView.class.getName()).log(Level.SEVERE, null, ex);
        }
       
        jFileChooser_Dest.rescanCurrentDirectory();
    }       

NetBeans Java mise à jour d'un TextArea

J'ai fait un petit programme en Java avec NetBeans pour créer un GUI pour les usagers.  Dans l'interface j'ai placé un TextArea pour donner le statut des étapes que le programme faisait.  En modifiant dans le contenu du TextArea dans le code, je me suis rendu compte que celui-ci ne se mettait pas à jour jusqu'à temps que le code de l'event d'un Bouton n'était pas complété.  Étant un petit programme, je ne voulais pas trop passer de temps à coder celui-ci, donc j'ai pu régler la situation de cette façon:

jTextArea_Statut.append("Copie des fichiers terminée.\n");
jTextArea_Statut.update(jTextArea_Statut.getGraphics());
       
jTextArea_Statut.append("Conversion des fichiers en cours.\n");
jTextArea_Statut.update(jTextArea_Statut.getGraphics());

Ogre3D tutoriel pour mouvement personnage

http://codefreax.org/tutorials/view/id/3