获取当前活动的应用程序名称

时间:2022-01-14 07:33:40

I want to get name of currently active application when my timer stops. After recording of 20 secs it should show me current active application name. I tried some code. You can see here. But it's not showing me anything after timer stops.

我想在计时器停止时获取当前活动应用程序的名称。记录20秒后,它应显示当前活动的应用程序名称。我尝试了一些代码。你可以在这里看到。但是在计时器停止后它没有显示任何东西。

C# code:

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();
    }

1 个解决方案

#1


13  

Edit: Title is missleading.

编辑:标题是误导性的。

Watch your 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
}

Working example:

工作范例:

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

to get the Foreground Window and:

获取前景窗口和:

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

To determine the ProcessID. With the ProcessID you're able to obtain the name of the process. With the Process Class: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.mainmodule.aspx

确定ProcessID。使用ProcessID,您可以获取进程的名称。使用Process类: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);
}

#1


13  

Edit: Title is missleading.

编辑:标题是误导性的。

Watch your 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
}

Working example:

工作范例:

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

to get the Foreground Window and:

获取前景窗口和:

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

To determine the ProcessID. With the ProcessID you're able to obtain the name of the process. With the Process Class: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.mainmodule.aspx

确定ProcessID。使用ProcessID,您可以获取进程的名称。使用Process类: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);
}