Sterowanie aplikacjami

0

Witam,
Chciałbym napisać aplikację, która umożliwi mi sterowanie innymi aplikacjami. Na początku myślałem o wykorzystywaniu skrótów klawiszowych. Chciałem skorzystać z:
Process[] processlist = Process.GetProcessesByName("NazwaAplikacji");
Process proc = processlist[0];
proc.WaitForInputIdle();
IntPtr p = proc.MainWindowHandle;
SwitchToThisWindow(p, 1);
SendKeys.SendWait(" ");

Podejrzewam, że można by jakoś ładniej symulować wciśnięcie przycisku klawiatury ale aplikacja musi wykorzystywać skróty oraz muszę złapać fokus na oknie. Więc tą metodę sobie podarowałem.
	
Później chciałem skorzystać z:
<code class="c#">[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

Ale tutaj aplikacja musi obsługiwać SendMessage(). Udało mi się to zastosować dla KMPlayera, ale już foobar tego nie obsługuje.

Ściągnąłem do testów program Girder. Da się tam ustawić sterowanie aplikacją bez łapania fokusu na oknie. Można uruchomić System Wide Capturing i łapać wszystkie zdarzenia w systemie. Przez Test Event możemy wykonać operację, którą wcześniej złapaliśmy. Nie musimy mieć fokusu na oknie sterowanej aplikacji. I działa z każdą testowaną przeze mnie aplikacją.

Załączam plik ze screenem z aplikacji System Wide Capturing. Uruchomiłem łapanie eventów i naciskałem przyciski w aplikacji foobar.
Wciśnięcie każdego przycisku to 2 zdarzenia: LeftClick i Command. Próbowałem wykorzystać kody z tej tabeli w metodzie SendMessage() ale nie udało mi się sterować aplikacją.
Może ktoś z Was wie w jaki sposób w C# można osiągnąć efekt symulacji wciśnięcia dowolnego przycisku w aplikacji.
Dzięki za pomoc

0

Może ktoś z Was wie w jaki sposób w C# można osiągnąć efekt symulacji wciśnięcia dowolnego przycisku w aplikacji.

Nie można osiągnąć tego w C#. Zaprzyjaźnij się z WinApi i C lub C++ i poczytaj o globalnych hookach i subclassingu.

1
othello napisał(a):

Może ktoś z Was wie w jaki sposób w C# można osiągnąć efekt symulacji wciśnięcia dowolnego przycisku w aplikacji.

Nie można osiągnąć tego w C#. Zaprzyjaźnij się z WinApi i C lub C++ i poczytaj o globalnych hookach i subclassingu.

Uzasadnij dlaczego nie można? W C# można importować funkcje WinAPI. Można też pisać kod niezarządzany.

0

Oczywiście możesz wstrzykiwać dll z poziomu C# za pomocą dllimport np., ale sama biblioteka dll musi być niezarządzana czyli napisana w C albo C++ bez użycia .net framework.

1

Uzasadnij dlaczego nie można? W C# można importować funkcje WinAPI. Można też pisać kod niezarządzany.
Oficjalne stanowisko Microsoftu brzmi:

Except for the WH_KEYBOARD_LL low-level hook and the WH_MOUSE_LL low-level hook, you cannot implement global hooks in the Microsoft .NET Framework.

No właśnie, nie można z wyjątkiem klawiatury i myszy. Czyli można ;-)

A dlaczego innych hooków nie można, to dość złożona sprawa, ale dobrze opisana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1