2013-06-27 42 views
6

Tôi muốn nhận tên của ứng dụng hiện đang hoạt động khi hẹn giờ của tôi dừng. Sau khi ghi 20 giây, nó sẽ hiển thị cho tôi tên ứng dụng đang hoạt động hiện tại. Tôi đã thử một số mã. Bạn có thể thấy ở đây. Nhưng nó không hiển thị cho tôi bất cứ điều gì sau khi bộ đếm thời gian dừng lại. # mãNhận tên ứng dụng hiện tại đang hoạt động

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

Bạn có muốn biết tiêu đề của cửa sổ hiện tại không? http://stackoverflow.com/questions/115868/how-do-i-get-the-title-of-the-current-active-window-using-c – Lucas

+0

Tôi muốn tên ứng dụng. Nếu notepad đang chạy trong nền sau đó, nó sẽ hiển thị tên tôi là "Notepad" ở đó. – Dinesh

+1

Câu hỏi đặt ra là: bạn có muốn tiêu đề cửa sổ hoặc tên quy trình của ứng dụng nền trước không? – Andre

Trả lời

12

Edit: Tiêu đề được missleading.

Xem 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 
} 

dụ làm việc:

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

để có được Window Foreground và:

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

Để xác định ProcessID. Với ProcessID, bạn có thể lấy tên của quá trình. Với quy trình lớp học: 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); 
} 
Các vấn đề liên quan