Reklama
Pokazuje wyniki od 1 do 13 z 13

Temat: [C#] Wykonywanie programu w innej aplikacji

  1. #1
    Avatar piorunek098
    Data rejestracji
    2007
    Posty
    1,090
    Siła reputacji
    18

    Domyślny [C#] Wykonywanie programu w innej aplikacji

    Siema!

    Mam taki problem i nie wiem co wpisać w google. Mam program i chcę aby on wykonywał się w innym programie, tzn. np. wpisz to i to w tym oknie (zadanie jest o tyle proste, że wystarczy zaznaczyć to okno i coś wpisać). Jak to zrobić? Skumaliście o co chodzi?

    Działanie na innej aplikacji, zewnętrznej np. grze.
    Wyjdźcie z torga geje i lewaki. Broń Boże nie wchodźcie do moich tematów. Dziękuje.

  2. #2
    Avatar LGTK
    Data rejestracji
    2009
    Położenie
    Podlaskie, Białystok
    Wiek
    33
    Posty
    267
    Siła reputacji
    16

    Domyślny

    Chodzi Ci o tz. IPC? Komunikację między procesami? Z jednej przesyłasz info/polecenie do drugiej.
    Do wpisywania czegoś w oknie może wystarczyć funkcja sendmessage i pokrewne.
    Ostatnio zmieniony przez LGTK : 05-08-2013, 20:26
    PIŻMAG

  3. #3
    Avatar piorunek098
    Data rejestracji
    2007
    Posty
    1,090
    Siła reputacji
    18

    Domyślny

    Masz powiedzmy tibie, chce żeby uaktywnił okno napisał "dupa romana" i nacisną enter. Proste tylko jak zrobić, żeby on to zrobił w tibi?
    Wyjdźcie z torga geje i lewaki. Broń Boże nie wchodźcie do moich tematów. Dziękuje.

  4. Reklama
  5. #4
    Avatar LGTK
    Data rejestracji
    2009
    Położenie
    Podlaskie, Białystok
    Wiek
    33
    Posty
    267
    Siła reputacji
    16

    Domyślny

    hWnd to uchwyt okna
    Kod :
     [DllImport("User32.dll")] 
        static extern int SetForegroundWindow(IntPtr hWnd);
    
        [DllImport("User32.Dll", EntryPoint = "PostMessageA")]
        static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
    Powinno latać bylebyś dobrze uchwyt znalazł.

    Zresztą poszukaj info o tych funkcjach w C#
    Ostatnio zmieniony przez LGTK : 05-08-2013, 20:38
    PIŻMAG

  6. #5
    Avatar piorunek098
    Data rejestracji
    2007
    Posty
    1,090
    Siła reputacji
    18

    Domyślny

    Kod :
    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hwnd, int msg, int wParam, StringBuilder sb);
    
    StringBuilder sb = new StringBuilder(length + 1);
    SendMessage(edit, WM_GETTEXT, length + 1, sb);

    Gdzie tutaj wpisać do którego okna ma się odwołać? Słabo to rozumiem :/
    Ostatnio zmieniony przez piorunek098 : 05-08-2013, 21:07
    Wyjdźcie z torga geje i lewaki. Broń Boże nie wchodźcie do moich tematów. Dziękuje.

  7. #6

    Data rejestracji
    2010
    Położenie
    Aͦͯ͐̾͐ͦ̋̽́̎̀͗̌͡͏̸&#7
    Posty
    2,138
    Siła reputacji
    17

  8. Reklama
  9. #7
    Avatar piorunek098
    Data rejestracji
    2007
    Posty
    1,090
    Siła reputacji
    18

    Domyślny

    Czyli w C# nie da się czegoś takiego napisać?

    Cytuj niemoralny napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Debilne to jest.
    Ostatnio zmieniony przez piorunek098 : 05-08-2013, 21:34
    Wyjdźcie z torga geje i lewaki. Broń Boże nie wchodźcie do moich tematów. Dziękuje.

  10. #8
    Avatar LGTK
    Data rejestracji
    2009
    Położenie
    Podlaskie, Białystok
    Wiek
    33
    Posty
    267
    Siła reputacji
    16

    Domyślny

    JAK SIĘ NIE DA, pisałem żebyś poczytał o tych funkcjach.

    Najpierw szukasz uchwytu okna za pomocą funkcji FindWindow() (szukaj C# findwidnow) potem używasz SetForegroundWindow(); a następnie sendmessage();

    @EDIT
    By wyglądało mniej więcej tak
    Kod :
    IntPtr hWnd = FindWindow("nazwa_klasy_okna","nagłówek");
    SetForegroundWindow(hWnd);
    StringBuilder sb = new StringBuilder("teskt");
    SendMessage(hWnd,   WM_SETTEXT, sb.Length, sb);
    Ostatnio zmieniony przez LGTK : 05-08-2013, 22:00
    PIŻMAG

  11. #9
    Avatar piorunek098
    Data rejestracji
    2007
    Posty
    1,090
    Siła reputacji
    18

    Domyślny

    Dzięki ziomek. Jesteś bogiem. Właśnie napisałem pierwszego bota do tibianica :D



    @edit

    Kod :
    
    Process[] processes = Process.GetProcessesByName("notepad");
    
    foreach (Process p in processes)
    
    {
    
        // Do something with the handle...
    
        //
    
    }

    Może mi ktoś wytłumaczyć jak to działa? Ta wiedza jest mi potrzebna do dalszego pisania.
    Ostatnio zmieniony przez piorunek098 : 06-08-2013, 00:42
    Wyjdźcie z torga geje i lewaki. Broń Boże nie wchodźcie do moich tematów. Dziękuje.

  12. Reklama
  13. #10
    Avatar Sir Krzaku
    Data rejestracji
    2005
    Posty
    23
    Siła reputacji
    0

    Domyślny

    Wygląda mi na to, że program wykona to co jest w pętli na wszystkich procesach zawierających w swojej nazwie słowo "notepad".
    Cytuj Pilos napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Strasznie dużo dłubie w nosie. Można to nazwać natręctwem. Fluki wycieram o dolną część krzesła.
    TORG <333

  14. #11
    Avatar LGTK
    Data rejestracji
    2009
    Położenie
    Podlaskie, Białystok
    Wiek
    33
    Posty
    267
    Siła reputacji
    16

    Domyślny

    Cytuj piorunek098 napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Dzięki ziomek. Jesteś bogiem. Właśnie napisałem pierwszego bota do tibianica :D



    @edit

    Kod :
    
    Process[] processes = Process.GetProcessesByName("notepad");
    
    foreach (Process p in processes)
    
    {
    
        // Do something with the handle...
    
        //
    
    }

    Może mi ktoś wytłumaczyć jak to działa? Ta wiedza jest mi potrzebna do dalszego pisania.
    Ja bym tego tak nie robił lekki bezsens. Nie szukaj klienta za każdym razem kiedy chcesz coś do niego wysłać. Najlepiej jak na starcie dasz możliwość wyboru i potem ewentualną możliwość zmiany tego.
    PIŻMAG

  15. #12
    Avatar piorunek098
    Data rejestracji
    2007
    Posty
    1,090
    Siła reputacji
    18

    Domyślny

    Cytuj LGTK napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Ja bym tego tak nie robił lekki bezsens. Nie szukaj klienta za każdym razem kiedy chcesz coś do niego wysłać. Najlepiej jak na starcie dasz możliwość wyboru i potem ewentualną możliwość zmiany tego.

    Rozwiązałem to już inaczej. Przeszukuje klienta i wysyła to do zmiennej. Mam inny problem, bo chcę żeby robił to w pętli. Tylko, że jak mu wrzucam while'a to się zacina i nie robi tego kilka razy. Co mam zrobić, żeby po naciśnięciu przycisku program wykonał się kilka razy? Próbowałem już z tego funkcje robić ale efekt ten sam, ścina. Nie może być pętli w buttonie, czy skopał mi się visual?

    Kod :
    
     private void button1_Click(object sender, EventArgs e)
       {
    
    foreach (var proc in Process.GetProcessesByName("Tibianic"))
                {
                    myWindow = proc.MainWindowHandle;
                }
    
    while (i < 10)
                {
                    SetForegroundWindow(myWindow);
                    Thread.Sleep(10000);
                    SendKeys.Send("{ENTER}");
                    i++;
                }
        }
    Ostatnio zmieniony przez piorunek098 : 06-08-2013, 17:29
    Wyjdźcie z torga geje i lewaki. Broń Boże nie wchodźcie do moich tematów. Dziękuje.

  16. Reklama
  17. #13
    Avatar LGTK
    Data rejestracji
    2009
    Położenie
    Podlaskie, Białystok
    Wiek
    33
    Posty
    267
    Siła reputacji
    16

    Domyślny

    Ścina bo robisz to w obrębie głównego wątku aplikacji. Utwórz nowy wątek ew daj BackgroundWorker'a na formę i wykonaj w nim POPRAWIONY kod.

    Zdajesz sobie sprawę że to powinno lekko inaczej wyglądać...
    Jeśli chcesz 10x wysłać klawisz do jednego okna:
    Kod :
    foreach (var proc in Process.GetProcessesByName("Tibianic"))
                {
                    myWindow = proc.MainWindowHandle;
    while (i < 10)
                {
                    SetForegroundWindow(myWindow);
                    Thread.Sleep(10000);
                    SendKeys.Send("{ENTER}");
                    i++;
                }
                }
    Jeśli raz do każdego:
    Kod :
    foreach (var proc in Process.GetProcessesByName("Tibianic"))
                {
                    myWindow = proc.MainWindowHandle;
    
                    SetForegroundWindow(myWindow);
                    Thread.Sleep(10000);
                    SendKeys.Send("{ENTER}");
                    i++;
                
                }
    Zależy co chcesz osiągnąć :)

    Pętla foreach leci po każdej instancji klasy w tym przypadku procesu mającego w nazwie "tibianic". Więc za pętlą będziesz miał tylko ostatni obiekt.
    Ostatnio zmieniony przez LGTK : 06-08-2013, 19:18
    PIŻMAG

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Format C z partycji recovery. Bez utraty danych z innej partycji. Jak?
    Przez eRbe w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 1
    Ostatni post: 20-07-2014, 17:19
  2. [PHP] Wyciąganie danych z innej strony
    Przez BBsrv w dziale Programowanie
    Odpowiedzi: 3
    Ostatni post: 01-10-2013, 19:36
  3. przeniesienie sie do innej szkoly
    Przez Tryhard Mode w dziale Szkoła i nauka
    Odpowiedzi: 3
    Ostatni post: 11-07-2013, 10:34
  4. Studiowanie a rekrutacja do innej uczelni
    Przez Bomberix w dziale Szkoła i nauka
    Odpowiedzi: 5
    Ostatni post: 05-10-2012, 20:12
  5. Poszukuje denerwującego programu/aplikacji
    Przez kubulski w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 1
    Ostatni post: 02-03-2012, 20:07

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •