Zachytenie správy Windows o horizontálnom posuve koliečka na myši
Dá sa zistiť akú správu vyšlú pre systém neznáme tlačítka? Takže pomaly: Mám myš, ktorá má horizontálny posun (PS2) a tlačítka dopredu a dozadu. Systém "nepozná" koliečko pre posuv v horizontálnom smere. Ovladač mi nevyhovuje, pretože mení funkciu vertikálneho koliečka a to tak, že síce funguje posuv v texte o nastavený počet riadkov, ale v programe Total Commander sa pri použití vertikálneho koliečka posunie zoznam súborov nie o jeden posun komponenty ScrollBar, ale o toľko posuvov, koľko mám nastavených riadkov pri posuve koliečka v texte. Mojou predstavou je zachytiť správu, ktorú generuje horizontálne koliečko a zmeniť ju na správu pre posuv horizontálnej komponenty ScrollBar. Na pohľad jednoduhá vec, ale pre naprogramovanie je nutné urobiť tieto kroky:
1. Zistiť aká správa je vyslaná.
2. V prípade, že je to existujúca správa, treba zistiť, aký je rozdiel medzi originálnou a touto.
3. Zmeniť správu nad úrovňou systému, čiže zablokovať pôvodnú a vyslať novú.
Týmto postupom by som dokázal nahradiť funkciu ovladača a vystačil by som aj s pôvodným, ktorý je lepší. Ak nepoužívam ovladač k myši, tak koliečko pre horizontálny posuv sa správa ako dve posunutia koliečka pre vertikálny posun. Vie niekto poradiť?
Ak chces byt "nad urovnou systemu" (system hook) tak mozes len menit message za iny message, nemozes posuvat "komponentu ScrollBar" v programe ktory si sam nenaprogramoval.
Studijny material: msdn.microsoft.com, hladat pokec o "system hooks". Potom si mozes sledovat co za message ide cez system. Zaujimavy je aj program tusim sa vola "spy++" ktory sa instaluje spolu s VC++, ale sledovat spravy mozes len na urovni okien, nie co robia system hooky.
P.S: nechapem co vlastne riesis, ved v totalcommanderi posuva kolecko tiez o nastaveny pocet riadkov (nema to IMHO nic spolocne s "krokom" scrollbaru), tak to ma predsa byt.
Pro skrolovani koleckem se pouziva zprava WM_MouseWheel
Ale mysi, ktere to delaji nestandardne - vyklaneci kolecko, 20 lacitek jsou zavisle na ovladacich, protoze Windows zna pouze mys se 3 tlacitky a koleckem. Ovladace stisk tlacitek prevedou na nejaky prikaz (zpravu), kterou Windows znaji. Takze treba klidne budou posilat stisk sipek Up a Down
Ako zachytím správy z myši? Keby zachytávam všetky správy, tak ich mám možno aj 100 za sekundu. Zachytenie správ je v knihe o Delphi, ktorú som požičal, ale ako zistiť, že správa je od myši, to tam myslím nebolo. Ide mi o jednoduché delenie správ, aby som sa v tom mori správ vyznal. Povedzme, že to ListBoxu mi naskáču len správy od myši.
coze?
Vsetko co potrebujes je na msdn.microsoft.com, ak chces nieco vediet o spravach a oknach vo Win atd. budes musiet venovat nejaky cas studiu msdn.
http://msdn.microsoft.com/library/default.asp?url=/ library/en-us/winui/winui/windowsuserinterface/wind owing/hooks/abouthooks.asp
Nemyslel som tak. Ešte som v Delphi nerobil so správami a nechcel by som odstaviť Windows. Stačí mi jednoduchý program na zobrazenie správy v ListBoxe. Ide o to, že ak sa to nenapíše správne, tak mi zamrzne Windows, lebo mu spapám všetky správy. Myslím, že už aj viem ako na rozdelenie. Raz mi písal Rce o funkciách, ktoré sú volateľné aj bez vytvorenia inštancie objektu. Jednou z týchto funkcií je zistenie názvu objektu. Ak bude v názve slovo Mouse, tak je to od myši. Teraz potrebujem len vedieť, ako to správne odchytiť, aby som nezhodil systém.
OMG, najprv si ujasni ci chces pozerat spravy ktore pridu nejakemu oknu aplikacie (tym nic windowsom nespapas ptz windowsy nezaujima co si aplikacia robi so spravami ktore Win poslali oknu aplikacie ak ma to okno zrovna focus (a ak okno nema focus tak nic od Windows nedostane)), alebo ci chces robit system hook, ak chces robit system hook, tak nechapem potom o com pises ked je pre mys specialny system hook. Do msdn si sa ani nepozrel, mozem to vypisovat aj 10x
P.S: ak sa snazis programovat systemove veci, tak sa budes musiet odputat od toho delphi myslenia. V systeme nie su ziadne komponenty ani objekty s nazvom Mouse, ani nic podobne. Sprava je jedno cislo, nic viac.
No dobre, takže: Spomenul som si, že zdrojáky ku knihe, ktoré boli na CD som si skopíroval do počítača a pomocou fulltextu som nakoniec našiel zdroják, ktorý som chcel, či mi niekto nenapíše. Jedná sa o zachytenie všetkých správ a ich počítanie. No takže zistil som, že ak okno má focus, tak správu dostane, ak nemá focus, ale je nad ním kurzor myši, tak tiež. Ak nie je nad ním korzor, tak správu nedostane. Mám teda zachytené správy, ale zistil som, že správa nie je objekt, ale záznam a teda neviem zistiť jej názov. Tu je výpis programu: Vie mi niekto poradiť, ako zistím názov správy?
Nijak sprava je len cislo, nazvy sa pouzivaju len na to aby programator nepisal do programu cisla. Filtruj si spravy ktore potrebujes cez if
Stiahni si nejaky spy program tam si to budes moct naklikat.
UINT je ak sa nemýlim Cardinal v Delphi, čiže kladný 32 bitový Integer. A to je číslo správy. Dobre, ešte pohľadám v helpe konštanty súvisiace s myšími správami a môžem sa pustiť do filtrovania.
Nechapem preco si radsej nestiahnes nejaky spy program, tam to mas aj s nazvami a aj s parametrami a mozes si aj filtrovat.
Dal som do Google spy++ a jediné schopné, čo mi naskočilo aj tak nie je to čo chcem:
windowfinder.asp
Hned druhy odkaz google
www.windows-spy.com
download
neskusal som ale ma to byt vylepsene spy++
http://www.autohotkey.com/docs/misc/SendMessageList .htm pomocou Google:
http://www.google.sk/search?hl=sk&client=firefox-a& rls=org.mozilla%3Ask%3Aofficial&q=windows+messages & btnG=H%C4%BEada%C5%A5&meta=
Edit: Aký je rozdiel medzi prvými a poslednými správami (majú rovnaké čísla)?
uz si zabudol aku linku ma msdn library? Je tam okienko na vyhladavanie, vlavo hore. Nakoniec ti MS pripravil aj konstanty na ten rozsah, ako si chcel.
http://www.google.sk/search?q=WM_MOUSEFIRST&ie=utf- 8&oe=utf-8&rls=org.mozilla:sk:official&client=firef ox-a
19072
Je to rozsah správ myši. Týmto môžem vlákno označiť za vyriešené. Ďakujem za spoluprácu.
... na to pozeranie sprav ktore pridu nejakemu oknu (aplikacii) uz je napr. spy++, nemusis nic programovat. Google.
P.S: vsimni si ze stale pisem slovo "oknu". Spravy totiz dostavaju vzdy okna (to je prvok OS ktory musi spracovavat spravy), nie aplikacie ako take.
Dobre, takže to znamená, že ak chcem spraviť niečo také s myšou ako hovorím, tak mi neostáva urobiť nič iné než ovladač na myš. Ale podľa toho čo píšeš by nebolo problémom urobiť aspoň podporu horizontálneho koliečka v mojich aplikáciách.
Nie, pisal som ti predsa ze mozes pouzit system hook, ak by si potreboval menit nejaku spravu na nejaku inu spravu. Na to tam ten system hook je. Na robenie ovladaca zabudni.
P.S. tym systemhookom ak by si to urobil blbo tak by si samozrejme mohol zrusit vsetky spravy mysi ktore idu v systeme, ale Windows by bezal dalej (restart klavesnicou alebo tlacitkom na bedni apod).
... a kedze pre mys je specialny system hook, tak potom nechapem co chces teraz filtrovat. Inac v system hooku si asi nebudes moct plnit listbox (ked tak len ulozit info niekde do pamate a hned prec, listbox aktualizovat specialnou spravou svojmu oknu alebo timerom), inac by si extremne spomalil cely system alebo by to (mys) vobec neslo.