CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Screenshot z okna

Screenshot z okna

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: Screenshot z okna

Nowy postprzez polymorphism » niedziela, 25 września 2016, 18:00

Heh, Baron, nie chodziło mi o sam fakt użycia pętli, tylko o wielokrotne wywołanie funkcji SendInput, co być może ma wpływ na kolejność docierania komunikatów.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » niedziela, 25 września 2016, 18:10

Na pewno ma wpływ, bo niektóre komunikaty mogą być blokowane.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Arnold_S » wtorek, 27 września 2016, 22:30

Panowie! Lepszej odpowiedzi nie mogłem się spodziewać. Bardzo dziękuje i zabieram się do pracy. Wrócę z kolejnym problemem lub prośbą o wiedzę.
8-)


/edit
Tak zastanawiałem się nad tą tablicą struktury INPUT i mam kilka pytań.

1. W moim kodzie, dla "podniesienia" klawisza użyłem następującej instrukcji:
KOD cpp:     UKRYJ  
aaa.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;    //podniesienie klawisza

Czy "flaga" KEYEVENTF_SCANCODE jest tutaj do czegoś potrzebna, czy wystarczy samo KEYEVENTF_KEYUP. W sumie program działa jednakowo i tak ...i tak. hmmm


2. Tablica "INPUT-ów" musiałaby zawierać 2x tyle pól ile jest liter w stringu przygotowywanym do wysłania. Każda literka zajmie 2 pola w tablicy (jedno dla wduszenia klawisza, a drugie dla zwolnienia klawisza). Przykładowy kod:
KOD cpp:     UKRYJ  
INPUT aaa[4] = {0};

// wduszenie klawisza 'A' - 0x1E
aaa[0].type = INPUT_KEYBOARD;
aaa[0].ki.dwFlags = 0;
aaa[0].ki.time = 0;
aaa[0].ki.dwExtraInfo = 0;
aaa[0].ki.wScan = 0x1E;
aaa[0].ki.dwFlags = KEYEVENTF_SCANCODE;

// zwolnienie klawisza 'A' - 0x1E
aaa[1] = aaa[0];
aaa[1].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;  //tutaj wstawiam te dwie flagi bo nie mam pewności jak to naprawdę powinno być.

// wduszenie klawisza 'B' - 0x30
aaa[2] = aaa[0];
aaa[2].ki.wScan = 0x30;
aaa[2].ki.dwFlags = KEYEVENTF_SCANCODE;

// zwolnienie klawisza 'B' - 0x30
aaa[3] = aaa[0];
aaa[3].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;

SendInput(4,in,sizeof(INPUT));
 

Tak myślę, że jeśli zdefiniowałbym tą tablicę struktur poza tą feralną funkcją, w feralnym timerze, to zyskałbym trochę czasu w [ms]. Ponieważ wewnątrz funkcji odwoływałbym się do tych pól wskaźnikiem. To byłoby chyba szybsze niż wypełnianie tego wszystkiego wewnątrz funkcji. Jest tylko jeden problem...
Gdy robię to na piechotę, bez tablicy INPUT-ów, to między wduszeniem a zwolnieniem kolejnych klawiszy mogę umieścić Sleep(); Tutaj nie widzę takiej możliwości. Jest aaa[?].ki.time. Na MSDN piszą, że to "time stamp" ale szukam informacji i nigdzie nie mogę znaleźć czy to faktycznie jest opóźnienie w [ms], czy po prostu czas pozostawiony do dyspozycji dla tego zdarzenia. Jak to rozumieć? Czy ktoś z Was testował jak to naprawdę jest?


3. Ostatnie pytanie: jak często używać funkcji Application->ProcessMessages(); ? Czy przed wywołaniem funkcji SendInput();? Czy pomiędzy wduszeniem a zwolnieniem przycisku? Czy po każdym wywołaniu funkcji SendInput(); nie zależnie czy chodzi o wduszenie, czy zwolnienie klawisza?
Jak odnieść się z Application->ProcessMessages(); do przykładu z tablicą INPUT-ów? gdzie to wcisnąć w kodzie?
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez polymorphism » środa, 28 września 2016, 11:33

1. Wydaje mi się, że jeśli wysłałeś key down z tą flagą, to i key up także powinien ją mieć.
2. W tym przypadku nie musisz walczyć o każdą milisekundę. Najpierw napisz kod tak, żeby działał, a później optymalizuj, o ile to konieczne. Co do pola time, możesz spróbować poustawiać tam jakieś odstępy czasowe (w ms), jeśli dla zera kolejność docierania komunikatów jest nieprawidłowa.
3. Nie używać.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » środa, 28 września 2016, 22:51

Co do KEYEVENTF_SCANCODE. Jest chyba tak, że jeżeli pomijasz argument wVk to musisz użyć tej flagi.



polymorphism napisał(a):3. Nie używać.


Tutaj się nie zgodzę. Jeżeli używasz funkcji Sleep() powinieneś zaraz po niej użyć funkcji ProcessMessages(). Poza tym w sytuacji gdy aplikacja wykonuje długi ciąg instrukcji i operacja zajmuje dużo czasu, a w tym czasie będziesz chciał np. przesunąć formularz, zmienić jego rozmiar, zakończyć pracę programu, to bez funkcji ProcessMessages() wywoływanej regularnie w trakcie wykonywania takich operacji, nie będzie możliwe zrobienie niczego innego, dopóki instrukcje nie dobiegną końca.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Mironas » czwartek, 29 września 2016, 09:29

Albo kiedy podczas jakiejś cyklicznej operacji chcesz wyświetlać okienko z paskiem postępu.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Screenshot z okna

Nowy postprzez polymorphism » czwartek, 29 września 2016, 10:49

Panowie, pisałem o tym konkretnym przypadku. Jeśli w zdarzeniu timera wysyła serię komunikatów jednym wywołaniem SendInput, to nie ma sensu wywoływanie ProcessMessages. Nie wiem, jak działa funkcja SendInput, ale jeśli wysyła serie komunikatów dość długo (po to, żeby zasymulować pisanie na klawiaturze), wtedy trzeba by napisać jakąś klasę (wykorzystującą wątek) do asynchronicznego wysyłania komunikatów.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Arnold_S » czwartek, 6 października 2016, 22:26

Panowie bardzo Wam dziękuję!! Naprawdę wiele mi pomogliście. Sporo się nauczyłem i jestem wdzięczny.
Z tym SendInputem to jest ciekawostka: gdy stosowałem metodę wysyłania znak po znaku to moja funkcja wysyłająca te sygnały osiągała minimum 722 ms.
Gdy skorzystałem z Waszej porady i skonstruowałem tablicę inputów, to przy najdłuższym loginie i haśle, tj.: 16 znaków wychodzi mi max. 122 ms.
Muszę to jeszcze dopracować ponieważ na wolniejszym komputerze już nie bardzo chce to działać tak bezbłędnie. Niestety muszę zniknąć na miesiąc lub dwa i nie będę miał czasu na programowanie ale gdy wrócę mam nadzieję, że Was tu zastanę :D

Pozdrawiam!!
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Poprzednia strona

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości

cron