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
- Pobranie klikniecia "Hook.dll".ProcedureFunction (zapisanie go do list<>clicks w "Hook.dll")
- Pobranie listy kliknięć
- Czyszczenie listy kliknięć
- Usunięcie ostatniego elementu listy
Globalna flaga w tym wypadku nic nie da, bo działo by się dokładnie to samo.