2016-08-19 1 views
-1

У меня есть настольное приложение .exe для Windows (WinForm), но у меня нет доступа к коду этого .exe-файла. Я хочу обработать событие двойного щелчка для этих .exe-элементов управления, которые отображаются уже внутри приложения.Как подключить событие click к элементам управления .exe?

Поскольку у меня нет кода, поэтому я начал использовать следующий подход.

  1. У меня есть программа на C#, которая работает в фоновом режиме и фиксирует все события двойного щелчка (используя концепции Hook).
  2. Если на рабочем столе создано какое-либо событие двойного щелчка, то я проверяю, работает ли мой .exe или нет.

    Process.GetProcesByName ("My exe name");

Так что если мой .exe работает, то я делаю свою бизнес-логику.

Проблема: - Я не хочу вызывать бизнес-логику, когда мой .exe только работает, но не на переднем плане. Это должно быть на переднем плане, тогда только я должен назвать свою бизнес-логику.

Поэтому здесь я хочу, чтобы проверка, которая говорит мне, является ли мой .exe на переднем плане или нет через мой код C#.

Если сам подход не подходит, пожалуйста, предложите мне другие способы сделать это.

+0

Возможный дубликат [Getting событий другого приложения] (http://stackoverflow.com/questions/7904544/getting-events-of-another-application) – Tokk

+0

не дублировать, потому что до глобального подсекать его работающ отлично. Проблема возникает при проверке, находится ли мой .exe на переднем плане или нет. –

ответ

0

Да, это код, который работает должным образом.

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

     [DllImport("user32.dll")] 
     static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); 

private string GetActiveWindowTitle() 
     { 
      const int nChars = 256; 
      StringBuilder Buff = new StringBuilder(nChars); 
      IntPtr handle = GetForegroundWindow(); 

      if (GetWindowText(handle, Buff, nChars) > 0) 
      { 
       return Buff.ToString(); 
      } 
      return null; 
     } 

Тогда в моих глобальных крючках событий,

private void HookManager_MouseDoubleClick(object sender, MouseEventArgs e) 
    {    
     string activeWindow = this.GetActiveWindowTitle(); 

     if (activeWindow.ToLower().Contains("my .exe name") && e.X >= 64 && e.X <= 86 && e.Y >= 32 && e.Y <= 54) 
      CallChildProcess();      
    } 

Пожалуйста, обратитесь к ссылке ниже для глобальных крючков событий.

http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C?msg=5288013#xx5288013xx