2013-06-27 2 views
6

Ich möchte den Namen der momentan aktiven Anwendung erhalten, wenn mein Timer stoppt. Nach einer Aufnahme von 20 Sekunden sollte der aktuelle Name der aktiven Anwendung angezeigt werden. Ich habe etwas Code ausprobiert. Sie können hier sehen. Aber es zeigt mir nichts nach dem Timer stoppt.Den aktuellen aktiven Anwendungsnamen abrufen

C# -Code:

public class Win32wrapper 
{ 
    private System.Timers.Timer pingTimer; 
    private Timer recordTimer; 

    private List<HarvestApp.ProcessInformation> ProcessList = new List<HarvestApp.ProcessInformation>(); 

    [DllImport("user32.dll")] 
    public static extern IntPtr GetForegroundWindow(); 

    [DllImport("user32.dll")] 
    public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint processId); 

    private DateTime recordStartTime; 

    public void startTimer(int pingTimerValue=5000, int recordTimerValue=20000) 
    { 

     pingTimer = new System.Timers.Timer(pingTimerValue); 
     pingTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     pingTimer.Interval = pingTimerValue; 
     pingTimer.Enabled = true; 

     recordTimer = new Timer(recordTimerValue); 
     recordTimer.Elapsed += new ElapsedEventHandler(OnRecordEvent); 
     recordTimer.Interval = recordTimerValue; 
     recordTimer.Enabled = true; 

     recordStartTime = DateTime.Now; 
    } 

    private void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Console.WriteLine("The Ping Elapsed event was raised at {0}", e.SignalTime); 


     //Record through win32dll the application foreground caption 

     GetActiveFileNameTitle(); 

     //Store into collection object, Push into ArrayList, Push into process id 
    } 


    public String GetActiveFileNameTitle() 
    { 
     IntPtr hWnd = GetForegroundWindow(); 
     uint processId; 
     GetWindowThreadProcessId(hWnd, out processId); 
     Process p = Process.GetProcessById((int)processId); 
     //p.MainModule.FileName.Dump(); 
     return p.ProcessName; 
    } 

     private void OnRecordEvent(object source, ElapsedEventArgs e) 
    { 
     Console.WriteLine("The Record Elapsed event was raised at {0}", e.SignalTime); 

     ProcessInformation procTemp = GetMaxRunTimeForApplicationsBetween(recordStartTime, DateTime.Now); 
     Harvest_TimeSheetEntry tempEntry = new Harvest_TimeSheetEntry(procTemp, recordStartTime, DateTime.Now); 

     //Add to the list of the specific day Only not the entire 
     // Globals._globalController.harvestManager._TIMESHEETENTRYDICTIONARY[recordStartTime.Date].Add(tempEntry); 


     Globals._globalController.getDayViewWindow.Dispatcher.BeginInvoke(new Action(delegate() 
     { 
      Globals._globalController.getDayViewWindow.addHarvestEntrytoView(tempEntry); 
     })); 
     //Clean Out the ProcessList? 

     recordStartTime = DateTime.Now; 
    } 


    public void stopTimer() 
    { 
     pingTimer.Stop(); 
     recordTimer.Stop(); 
    } 
+0

Haben Sie den Titel des aktuellen Fensters wissen? http://stackoverflow.com/questions/115868/how-do-i-get-the-title-of-the-current-active-window-using-c – Lucas

+0

Ich möchte Name der Anwendung. Wenn Notepad im Hintergrund läuft, sollte es dort meinen Namen als "Notepad" anzeigen. – Dinesh

+1

Die Frage ist: Möchten Sie den Fenstertitel oder den Prozessnamen der Vordergrund-App? – Andre

Antwort

12

Edit: Titel ist missleading.

Passen Sie Ihr Code:

private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    Console.WriteLine("The Ping Elapsed event was raised at {0}", e.SignalTime); 

    //Record through win32dll the application foreground caption 

    // You miss the output or usage of the return value here. 
    GetActiveFileNameTitle(); 
    // Try 
    var procName = GetActiveFileNameTitle(); 
    Console.WriteLine(procName); 

    //Store into collection object, Push into ArrayList, Push into process id 
} 

Arbeitsbeispiel:

[DllImport("user32.dll")] 
public static extern IntPtr GetForegroundWindow(); 

den Vordergrund Fenster zu erhalten und:

[DllImport("user32.dll", SetLastError = true)] 
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

die ProcessID zu bestimmen. Mit der ProcessID können Sie den Namen des Prozesses erhalten. Mit der Prozessklasse: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.mainmodule.aspx

class Program 
{ 
    static void Main(string[] args) 
    { 
     Thread.Sleep(5000); // Test it with 5 Seconds, set a window to foreground, and you see it works! 
     IntPtr hWnd = GetForegroundWindow(); 
     uint procId = 0; 
     GetWindowThreadProcessId(hWnd, out procId); 
     var proc = Process.GetProcessById((int)procId); 
     Console.WriteLine(proc.MainModule); 
     Console.ReadKey(); 
    } 

    [DllImport("user32.dll")] 
    public static extern IntPtr GetForegroundWindow(); 

    [DllImport("user32.dll", SetLastError = true)] 
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 
}