Kolejność odpalenia wątków

0

Witam, używam globalnego haka, którym zbieram coordy kliknięć myszki do listy w DLL.

Z DLL pobieram do Aplikacji listę metodą.

        static List<Rect> clicks = new List<Rect>();
        public static List<Rect> GetClicks()
        {
            return clicks;
        }

Pomiędzy kliknięciami odpalam metody w aplikacji które działają na liście która jest przechowywana w aplikacji (głównie usuwanie ostatniego elementu listy).
Dokładniej:
Klikam na przycisk w aplikacji "rozpocznij".
Klikam po ekranie - zbieram informacje o kliknięciach.
Klikam na przycisk w aplikacji "zakończ"

-chcę aby ostatnie kliknięcie nie zostało zapisane, dlatego usuwam ostatni element jednak ostatnie kliknięcie zostanie zapisane albo nie (zależy który wątek odpali się pierwszy).
-kliknięcia pobieram w timer.tick przez GetClicks() oraz bezpośrednio przed usunięciem ostatniego elementu

Jak pobrać dane z DLL tak aby wątek w DLL wykonywał się zawsze pierwszy? Wtedy kliknięcie zawsze zostaje zapisane do listy. Po czym mogę je pobrać poprzez GetClicks(). A nie w odwrotnej kolejności.

@Edit
Edytowałem pierwszy post. Ja wiem o co chodzi :p

2

Przeczytaj to co napisałeś i potem napisz jeszcze raz o co chodzi.

0

bla bla

bla bla bla

bla bla bla

zależy który wątek odpali się pierwszy

O! wątek! jaki wątek? nie mówiłeś nic o żadnych wątkach… :-(

0
Azarien napisał(a):

bla bla

bla bla bla

bla bla bla

zależy który wątek odpali się pierwszy

O! wątek! jaki wątek? nie mówiłeś nic o żadnych wątkach… :-(

Tinekk napisał(a):

używam globalnego haka, którym zbieram coordy kliknięć myszki

Z tego można dojść bardzo łatwo że jest to hak WH_MOUSE_LL i skoro jest globalny procedura jest w osobnym wątku niż ten na którym działa aplikacja.

0
Tinekk napisał(a):

Edytowałem pierwszy post. Ja wiem o co chodzi :p

Człowieku nikt nie wie o co ci chodzi, tylko ty to jak ktoś ma ci pomóc??

Nie wiem czy tak to ma rozumieć:
Masz aplikacje "dupa.exe" a na niej jakieś buttony w które sobie klikasz z różnymi napisami.
Masz druga apka o nazwie "hxior.exe" i ona ładuje "coś_tam.dll" i [w niej masz timer którym pobierasz na co została ostatnio najechana i kliknięta myszka dodajesz to do jakiejś listy](to jest global hook?) z którąś coś tam robisz?

0

Klikam na przycisk w aplikacji "zakończ"

-chcę aby ostatnie kliknięcie nie zostało zapisane, dlatego usuwam ostatni element jednak ostatnie kliknięcie zostanie
Czy tu mowa o kliknięciu na przycisk „zakończ”?
No to sprawdzaj pozycję kliknięcia, i jak wypada w przycisk „zakończ” to nie zapisuj.

0

Ustaw sobie gościu globalną flagę, którą będziesz ustawiał po przycisku zakończ.

@Azarien - to nie zawsze zadziała. Wyobraź sobie sytuację w której nacisnę nad przyciskiem "zakończ", przesunę myszkę poza niego i zwolnię przycisk.

0

Jedna aplikacja "dupa.exe" w której ładuje plik "Hook.dll"

                dllassembly = Assembly.LoadFrom("Hook.dll");
                Type[] tab = dllassembly.GetExportedTypes();
                Type _Hook = null;
                foreach (Type t in tab)
                {
                    if(t.Name=="Hook")
                    {
                        _Hook = t;
                    }
                }
                _ProcedureFunction = _Hook.GetMethod("ProcedureFunction");
                _InstallHook = (_Hook.GetMethod("InstallHook") != null) ? _Hook.GetMethod("InstallHook") : _InstallHook;
                _UninstallHook = (_Hook.GetMethod("UninstallHook") != null) ? _Hook.GetMethod("UninstallHook") : _UninstallHook;
                _GetClicks = (_Hook.GetMethod("GetClicks") != null) ? _Hook.GetMethod("GetClicks") : _GetClicks;
                _ClearList = (_Hook.GetMethod("ClearList") != null) ? _Hook.GetMethod("ClearList") : _ClearList;

Nie jestem w stanie (zresztą nikogo to pewnie nie obchodzi) działania całego programu, dlatego krótko zwięźle i na temat starałem się opisać o co mi chodzi.

W klasie [w pliku dll] trzymam metody: InstallHook,UninstallHook // chyba jasne
GetClicks // pozwala pobrać list<>clicks do głównej aplikacji "dupa.exe"
ClearList // czysći list<>clicks

W aplikacji "dupa.exe" włączony jest timer który co sekunde pobiera kliknięcia _GetClicks.invoke, następnie czysząc _ClearList.invoke.
w momencie kliknięcia przycisku button1/button2/button3/buttonn powinien nie zapisywać tego kliknięcia. Skoro procedura "zbierania" kliknięć znajduje się w "Hook.dll" muszę je pobrać, przetworzyć. I jeżeli ostatnie klikniecie było w button usunąć je - mogę to jedynie sprawdzić patrząc w jakim miejscu znajduje się przycisk (każdy z osobna) i czy pozycja ostatnich kliknieć przypadkiem się nie znajduje "nad" przyciskiem + czy dane okno jest na wierzchu.
Gdyby to działało na jednym wątku wystarczyło by zrobić
_GetClicks.invoke -> list.remove(ostatni) -> _ClearList.invoke
jednak w tym momencie ostatnie kliknięcie albo przychodzi przed list.remove albo po. Robi mi to znaczną różnice bo usuwa nie tą informacje co powinno.

Jaśniej już chyba się tego nie da wytłumaczyć.

Co zrobić żeby aplikacja "dupa.exe" zaczekała aż "Hook.dll".ProcedureFunction zapisze do GetClicks to ostatnie kliknięcie - dll nie wie że jest to ostatnie.
Nie uśmiecha mi się usypiać wątek w "dupa.exe" na powiedzmy sekundę żeby dać mu czas. Chciał bym aby cały proces ZAWSZE wyglądał 1234 a nie losowo 2134/2314/2314/2341

  1. Pobranie klikniecia "Hook.dll".ProcedureFunction (zapisanie go do list<>clicks w "Hook.dll")
  2. Pobranie listy kliknięć
  3. Czyszczenie listy kliknięć
  4. Usunięcie ostatniego elementu listy

Globalna flaga w tym wypadku nic nie da, bo działo by się dokładnie to samo.

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