Favicon Svetmobilne.cz  Svět mobilně Favicon Svetaudia.cz  Svět audia Favicon TVFreak.cz  TV Freak   Fórum Favicon Digimanie.cz  Digimanie   Fórum   Galerie Společnost oXy Online s.r.o.
Strana 1 z 2 12 PosledníPoslední
Zobrazené výsledky: 1 až 15 z 23

Téma: Kde (popr. jak) naprogramovat autoklik.

  1. #1
    Starousedlík SHW
    Registrace
    Feb 2008
    Příspěvků
    1,144

    Zdravim. Potrebuju program, ktery vyhodnoti situaci na monitoru (asi podminka kdyz) a dle toho pak provede zvolene instrukce (klik mysi na urcitou cast obrazovky). Existuje neco podobneho uz naprogramovaneho? Jestli ne, v cem se takove veci nejlepe programuji? Mam Windows XP. Diky za odpoved.
    Odpovídat lze po přihlášení

  2. #2
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    Ono záleží na co přesně má reagovat (objevení se nějakýho konkrétního okna a klepnutí na tlačítko v něm? - dělat to obecně přes skenování plochy a zpracování přímo obrazových dat by byla hodně náročná záležitost), v jednoduchým případě např. cyklický procházení oken přes EnumWindows a hledání okna s určitým názvem, v něm pak lze vyhledat např. určitej button (EnumChildWindows) a po jeho nalezení odeslat např. přes SendMessage že bylo stisknutý tlačítko. Apod.

    Jestli je něco takovýho hotovýho nevím, povětšinou podobný úkoly vyžadujou konkrétní přístup podle konkrétní činnosti, kterou je potřeba provést (programovat něco takovýho obecně by bylo asi vcelku složitý).

    Všechno se to většinou dělá přes WinAPI (http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx), obecně programovat přes WinAPI není úplně triviální. Funkce WinAPI lze volat z různých jazyků, např. C/C++ (který osobně preferuju), Pascal, C#, lze i VB ... nelze použít Javu (resp. lze, ale pouze přes JNI = naprogramování DLL v C/C++ a její volání z Javy).
    Odpovídat lze po přihlášení



  3. #3
    Starousedlík SHW Avatar uživatele xmarek
    Registrace
    May 2008
    Příspěvků
    1,689

    Citace Původně odesláno od Dojigiri Zobrazit příspěvek
    ... nelze použít Javu (resp. lze, ale pouze přes JNI = naprogramování DLL v C/C++ a její volání z Javy).
    Tento postup osobně nedoporučuji. Ne, že by to bylo nemožné, ale vyžaduje to nemalé zkušenosti z JNI a C++/C. A v tomto konkrétním případě je to už jednodušší napsat v "core" C++/C. Osobně používám JNI ke komunikaci se zařízeními připojenými přes USB (Seriový, Paralelní port).
    Odpovídat lze po přihlášení

  4. #4
    Starousedlík SHW
    Registrace
    Feb 2008
    Příspěvků
    1,144

    Diky za rychlou odpoved. Konkretne to potrebuju na vyhodnoceni barvy aspon 1 pixelu. Barva se meni nahodne. Dle zjisteni barvy by to udelalo tu, ci onu cinnost. Pres nazev okna atd to nejspise nepujde. dik.
    Odpovídat lze po přihlášení

  5. #5
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    Tak tam bys musel asi vzít screenshot obrazovky a procházet pixely. Pokud víš kterej pixel to přesně je (jaký má souřadnice X a Y), anebo je to dopočítatelný z nějakýho okna (tj. objevuje se to v nějak konkrétně pojmenovaným okně - pak by se muselo najít to okno a udělat jenom screenshot toho konkrétního okna). Jak vzít screenshot obrazovky je např. vidět v tomhle příkladu:
    http://groups.google.com/group/win32...c030edbaeaf026
    (funkce CaptureScreen)

    Případně se můžeš podívat na Windows Scripting a zajímavě vypadá tenhle program:
    http://www.autoitscript.com/
    (ale ani jedno nepoužívám takže nevím jestli konkrétně tohle bude umět)
    Odpovídat lze po přihlášení

  6. #6
    Starousedlík SHW
    Registrace
    Feb 2008
    Příspěvků
    1,144

    Dik za ten AutoIT, dival jsem se a je tam nejspise i mouseclick. Jeste tam zkusim vyhledat ten screenshot, ale ten tam nejspise nebude. Znam pozici i pozadovanou "barvu" pixelu. V cem je programovane to, co je na tom odkazu? Vidim to tak, ze dle barvy by to spustilo urcity soubor se skriptem -je to sice Pat a Mat reseni, ale snad bude fungovat
    Odpovídat lze po přihlášení

  7. #7
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    Ten příklad co jsem linkoval je v C, takže by měl jít přeložit překladačem C nebo C++ - pro Windows lze např. zdarma stáhnout Microsoft Visual Studio Express 2008 (stáhnout buď Visual C++ 2008 Express web instalaci, anebo celou offline instalaci dole), asi nejlepší volba, ale je to obrovský - cca 800 MB, anebo menší překladače MinGW (bez IDE), případně ještě Dev C++ (vcelku starý, ale funkční i s vývojovým prostředím, jeden čas jsem používal docela rád).
    Odpovídat lze po přihlášení



  8. #8
    Starousedlík SHW
    Registrace
    Feb 2008
    Příspěvků
    1,144

    Dekuji. A prosim jeste o trpelivost se mnou, programoval jsem jen v Pascalu
    Mohl byste mi napsat, jak by vypadal prikaz pro zjisteni barvy urciteho pixelu? Monitor 1440x900 a pixel je na X=200 Y=350. Barva je 238.205.125. Pak jeste podminkovy prikaz neco jako IF "barva" THEN "open file"
    Jak teda na to? Stacil by udelat "screen save" z jednoho pixelu a ten pak analyzovat, ale jak programu "rict", aby to udelal- s tim jsem v koncich. diky
    Odpovídat lze po přihlášení

  9. #9
    Starousedlík SHW
    Registrace
    May 2006
    Příspěvků
    4,042

    Jak udělat screenshot máš tady, omezit to na jeden pixel snad zvládneš...
    http://www.itags.org/programming/1200426/
    teda tam se získává obsah jednoho okna, pokud neumíš najít okno, imho svuj DC má i celá obrazovka - tady je to na celou obrazovku
    http://www.codeproject.com/KB/dialog/screencap.aspx
    Naposledy upraveno uživatelem Logout: 14-10-2009 v 15:47
    Odpovídat lze po přihlášení

  10. #10
    Pravidelný diskutér Avatar uživatele a8nr
    Registrace
    May 2006
    Příspěvků
    184

    Citace Původně odesláno od Dojigiri Zobrazit příspěvek
    nelze použít Javu (resp. lze, ale pouze přes JNI = naprogramování DLL v C/C++ a její volání z Javy).
    Mohlo by jít použít JNA, čímž by odpadlo vytváření dll, nicméně v tomto případě bude volba jiného jazyka lepší.
    Odpovídat lze po přihlášení

  11. #11
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    Tak šlo by to třeba nějak takhle (měl jsem připravenou kostru programu protože nedavno jsem dělal něco podobnýho tak jsem to zkusil):

    Kód:
    #include <cstdlib>
    
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    #include <tchar.h>
    #include <ShellApi.h>
    
    
    // Settings.
    const COLORREF testColor = RGB(238, 205, 125);
    const int posX = 200;
    const int posY = 350;
    
    
    int SystemError(LPTSTR sFuncName)
    {
        const int code = GetLastError();
        LPTSTR buff;
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
            NULL, code, 0,
            (LPTSTR)&buff, 0, NULL);
        MessageBox(NULL, buff, sFuncName, MB_OK | MB_ICONERROR);
        LocalFree(buff);
        return code;
    }
    
    
    HDC hDesktopDc = NULL;
    
    void OnExit()
    {
        if (hDesktopDc) {
            ReleaseDC(HWND_DESKTOP, hDesktopDc);
        }
    }
    
    const LPTSTR appName = _T("PixelCheck");
    
    int APIENTRY WinMain(
            HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpCmdLine,
            int nCmdShow)
    {
        // Check command line parameters.
        if (!lpCmdLine || !*lpCmdLine) {
            LPTSTR buff;
            FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                _T("Usage: %1 <file_name_to_run>"), 0, 0,
                (LPTSTR)&buff, 0, (va_list *)&appName);
            MessageBox(NULL, buff, appName, MB_ICONERROR | MB_OK);
            LocalFree(buff);
            return EXIT_FAILURE;
        }
    
        hDesktopDc = GetWindowDC(HWND_DESKTOP);
        if (!hDesktopDc) {
            return SystemError(_T("GetWindowDC"));
        }
        // Release the DC on exit.
        atexit(OnExit);
    
        bool status = false;
        for (;;) {
            const COLORREF color = GetPixel(hDesktopDc, posX, posY);
            if (CLR_INVALID == color) {
                return SystemError(_T("GetPixel"));
            } else {
                if (color == testColor) {
                    if (!status) {
                        status = true;
                        // Run the file.
                        const int execResult = (int)ShellExecuteA(NULL, NULL, lpCmdLine, "", NULL, SW_SHOWNORMAL);
                        if (execResult <= 32) {
                            SystemError(_T("ShellExecute"));
                        }
                    }
                } else {
                    status = false;
                }
    
            }
            Sleep(200);
        }
    
        return EXIT_SUCCESS;
    }
    To si můžeš případně poštelovat a přeložit - parametr programu je cesta exe nebo něčeho, co se má spustit (spustí se cokoliv, co otevře explorer, případně i složka). Zavře se to tak, že to zabiješ ve správci úkolů (šlo by samozřejmě udělat okno, kterým bys to zavřel, ovšem okno má svojí message loop, takže by smyčka pro testování barvy okna musela běžet v jiným vlákně; nebo by šlo pomocí instalace globálního hooku navázat zpracování na změnu screenu, takže by se to spustilo vždycky při změně něčeho na obrazovce, ale to už je zase taky složitostí trochu jinde, je potřeba udělat DLL s hook procedurou atd.).

    A fakt se ta barva objevuje celým screen a ne v nějakým okně jo? To je mi trochu divný (jo a btw. asi to nebude fungovat pro fullscreen video, nebo v directX hře apod. - pouze přímo pod Windows).

    (co se týká toho tvýho IF, tak jak vidíš v kódu to zase neni tak jednoduchý, protože asi nechceš, aby se ti to spouštělo pořád dokola, když barva trvá, takže je potřeba si pamatovat stav, a jenom když se barva změní zpátky na jinou, stav shodit a při příští změně na požadovanou barvu opět spustit požadovanou aplikaci ...)
    Naposledy upraveno uživatelem Dojigiri: 14-10-2009 v 21:16 Důvod: oprava chybičky
    Odpovídat lze po přihlášení

  12. #12
    Starousedlík SHW
    Registrace
    Feb 2008
    Příspěvků
    1,144

    Dekuji, ted se tim musim prokousat Jinak barva se meni v okne, ne na plose (to jsem tam nepsal) a po kazdem provedeni ukonu se "refreshuje" na novy vystup, ktery je bud stejny, nebo jiny.
    Kazdopadne pokud to udela screen save, staci jen, aby to okno bylo videt ne?

    V AutoIT vlastnosti oken jsem si vsiml, ze dokaze rozpoznat i barvu pixelu. Vi nekdo, jestli s ni umi i pracovat?
    Odpovídat lze po přihlášení



  13. #13
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    No pokud je to v okně, to bude skoro to samý, akorát že by se to okno muselo nejdřív najít podle názvu okna (nejlíp přes EnumWindows) jeho handle a ten pak použít pro GetWindowDC. Což by bylo samozřejmě lepší než když se to bude dělat pro celej screen (protože by to fungovalo i pro okna který jsou skrytý za jinýma, a pozice asi taky bude pozice v daným okně a ne na celým screen - je fakt, že jsi nikde přímo nepsal, že to je pro celej screen, jenom já to tak pochopil, přivedlo mě k tomu asi vyjádření že "Pres nazev okna atd to nejspise nepujde" ...)

    Co se týká AutoIt, ten jsem zatím nějak nezkoumal, ale jak teď na to koukám tak je to v podstatě jenom jinej způsob programování založenej na podobných principech a měl by to umět taky, třeba funkce PixelGetColor by myslím měla vrátit přímo barvu pixelu určitýho okna na určitých souřadnicích. Okno(a) s určitým názvem lze získat WinList nebo WinGetHandle ... hmm vypadá to na docela silnej nástroj na podobný úlohy.

    Opět to lze testovat ve smyčce, což je nejjednodušší ... ideální by samozřejmě bylo to navázat na repaint dotyčnýho okna (ale to je možná až zbytečný a vyžadovalo by to opět hook na window proceduru toho dotyčnýho okna) ...
    Naposledy upraveno uživatelem Dojigiri: 15-10-2009 v 10:38
    Odpovídat lze po přihlášení

  14. #14
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    Teď jsem si chvilku hrál s tím AutoIt, protože vypadá fakt zajímavě ... ovšem zase tak růžový to nejni, protože funkce PixelGetColor sice vrací pixel, ovšem z celý obrazovky a ne toho okna, kterej handle se mu dá (akorát je možný vzít souřadnice relativně k oknu, ovšem stále pro celou obrazovku - WTF) - což znamená, že by testovaný okno muselo bejt stále na popředí (jakmile to místo něco překreje, bere se pixel z toho jinýho okna).

    Lze to obejít tak, že se volají funkce přímo z WinAPI, což AutoIt taky umí takže by skript moh vypadat třeba následovně:

    Kód:
    $winName = "My Window";
    $posX = 200
    $posY = 350
    $color = (((238 * 256) + 205) * 256) + 125
    
    $interval = 200
    
    Opt("WinTitleMatchMode", 2)
    Opt("PixelCoordMode", 0)
    
    $hUser32 = DllOpen("user32.dll")
    $hGdi32 = DllOpen("Gdi32.dll")
    
    $status = False
    
    While True	; Endless loop.
    	$handle = WinGetHandle($winName);
    	if @error Then
    		$status = False
    	Else
    		$dc = GetDC($handle)
    		$current = GetPixel($dc, $posX, $posY)
    		if ($current == $color) Then
    			if Not $status Then
    				$status = True
    				MsgBox(0, "Colors match", "Color=" & $color)
    			EndIf
    		Else
    			$status = False
    		EndIf
    		ReleaseDC($handle, $dc)
    	EndIf
    
    	Sleep($interval)
    
    WEnd
    
    Func GetDC($handle)
    	$ret = DllCall($hUser32, "ptr", "GetWindowDC", "hwnd", $handle)
    	Return $ret[0]
    EndFunc
    
    Func ReleaseDC($handle, $dc)
    	$ret = DllCall($hUser32, "int", "ReleaseDC", "hwnd", $handle, "ptr", $dc)
    	Return $ret[0]
    EndFunc
    
    Func GetPixel($dc, $x, $y)
    	$ret = DllCall($hGdi32, "int", "GetPixel", "ptr", $dc, "int", $x, "int", $y)
    	Return $ret[0]
    EndFunc
    A místo toho MsgBox si tam můžeš dát takovou akci, kterou potřebuješ provést (třeba poslat klik někam).
    Odpovídat lze po přihlášení

  15. #15
    Starousedlík SHW
    Registrace
    Feb 2008
    Příspěvků
    1,144

    Takze misto "My window" dam nazev okna z Title ve AutoIT Window Info?
    Ten "dolar" pred znaci promennou?
    Proc se ty RGB cisla nasobi a scitaji?
    Kdyz mi samotne AutoIT Window Info vyhodi takovou barvu: 0x007C22, muzu pouzit tento udaj?
    Taky ale nemuzu zjistit pozici pixelu vzhledem k velikosti okna, pise mi to vzhledem k rozliseni monitoru, takze to asi budu muset dat na fullscreen a pak to premerit jeste jednou ze?
    To zatim vse. Velice dekuji za pomoc.
    Odpovídat lze po přihlášení

Strana 1 z 2 12 PosledníPoslední

Podobná témata

  1. Test IP kamer (popř. jakou)
    Od Pavel Kovač v sekci Internet
    Reakcí: 1
    Poslední příspěvek: 10-06-2011, 22:42