2013-06-27 14 views
6

タイマーが停止したときに現在アクティブなアプリケーションの名前を取得したいとします。 20秒の録音後、現在アクティブなアプリケーション名が表示されます。私はいくつかのコードを試しました。ここを見ることができます。しかし、タイマーが止まった後は何も表示されません。現在アクティブなアプリケーション名を取得

C#コード:

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

を使用すると、現在のウィンドウのタイトルを知りたいですか? http://stackoverflow.com/questions/115868/how-do-i-get-the-title-of-the-current-active-window-using-c – Lucas

+0

私はアプリケーションの名前が必要です。メモ帳がバックグラウンドで実行されている場合は、そこに「メモ帳」という名前が表示されます。 – Dinesh

+1

問題は次のとおりです:フォアグラウンドアプリケーションのウィンドウタイトルまたはプロセス名が必要ですか? – Andre

答えて

12

編集:タイトルmissleadingされます。

あなたのコードを見る:ProcessIDのを判断するには

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

:前面のウィンドウとを取得するために

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

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 
} 

は、たとえば作業。 ProcessIDを使用すると、プロセスの名前を取得できます。プロセスのクラスに :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); 
}