Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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ť?

Předmět Autor Datum
Ak chces byt "nad urovnou systemu" (system hook) tak mozes len menit message za iny message, nemozes…
MM.. 18.01.2007 19:36
MM..
Pro skrolovani koleckem se pouziva zprava WM_MouseWheel Ale mysi, ktere to delaji nestandardne - vyk…
Jan Fiala 18.01.2007 19:40
Jan Fiala
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. Zach…
msx. 18.01.2007 21:06
msx.
::) coze? Vsetko co potrebujes je na msdn.microsoft.com, ak chces nieco vediet o spravach a oknach v…
MM.. 18.01.2007 21:09
MM..
Nemyslel som tak. Ešte som v Delphi nerobil so správami a nechcel by som odstaviť Windows. Stačí mi…
msx. 18.01.2007 21:15
msx.
OMG, najprv si ujasni ci chces pozerat spravy ktore pridu nejakemu oknu aplikacie (tym nic windowsom…
MM.. 18.01.2007 21:17
MM..
No dobre, takže: Spomenul som si, že zdrojáky ku knihe, ktoré boli na CD som si skopíroval do počíta…
msx. 18.01.2007 21:33
msx.
Nijak :-) sprava je len cislo, nazvy sa pouzivaju len na to aby programator nepisal do programu cisl…
MM.. 18.01.2007 21:39
MM..
type TMsg = packed record hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt…
msx. 18.01.2007 21:53
msx.
Nechapem preco si radsej nestiahnes nejaky spy program, tam to mas aj s nazvami a aj s parametrami a…
MM.. 18.01.2007 22:34
MM..
Dal som do Google spy++ a jediné schopné, čo mi naskočilo aj tak nie je to čo chcem: windowfinder.as…
msx. 18.01.2007 22:42
msx.
Hned druhy odkaz google www.windows-spy.com download neskusal som ale ma to byt vylepsene spy++
MM.. 18.01.2007 22:50
MM..
http://www.autohotkey.com/docs/misc/SendMessageList .htm pomocou Google: http://www.google.sk/searc…
msx. 18.01.2007 22:54
msx.
uz si zabudol aku linku ma msdn library? :-) Je tam okienko na vyhladavanie, vlavo hore. :-) Nakonie…
MM.. 18.01.2007 23:02
MM..
http://www.google.sk/search?q=WM_MOUSEFIRST&ie=utf- 8&oe=utf-8&rls=org.mozilla:sk:official&client=fi… poslední
msx. 18.01.2007 23:05
msx.
... na to pozeranie sprav ktore pridu nejakemu oknu (aplikacii) uz je napr. spy++, nemusis nic progr…
MM.. 18.01.2007 21:24
MM..
Dobre, takže to znamená, že ak chcem spraviť niečo také s myšou ako hovorím, tak mi neostáva urobiť…
msx. 18.01.2007 21:36
msx.
Nie, pisal som ti predsa ze mozes pouzit system hook, ak by si potreboval menit nejaku spravu na nej…
MM.. 18.01.2007 21:40
MM..

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.

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?

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    PocetZprav: Integer;            // atribut uchovavajici dosavadni pocet doslych zprav
    // procedura AppOnMessage bude spustena vzdy po doruceni jakekoliv zpravy
    procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := 'Počet zpráv: 0';
  Button1.Caption := '&Do seznamu';
  Edit1.Text := '';
  Application.OnMessage := AppOnMessage;    // svazeme udalost OnMessage a metodu AppOnMessage
  PocetZprav := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // pokud neni editacni pole prazdne, pridame txt do seznamu
  if Edit1.Text <> '' then ListBox1.Items.Add(Edit1.Text);
end;

procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
  Inc(PocetZprav);                // zvysime citac zprav
  // upravime titulek formulare
  Caption := 'Počet zpráv: ' + IntToStr(PocetZprav);
end;

end.
type
  TMsg = packed record
    hwnd: HWND;
    message: UINT;
    wParam: WPARAM;
    lParam: LPARAM;
    time: DWORD;
    pt: TPoint;
  end;

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.

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)?

WM_MOUSEFIRST = 0x200
WM_MOUSEMOVE = 0x200
WM_LBUTTONDOWN = 0x201
WM_LBUTTONUP = 0x202
WM_LBUTTONDBLCLK = 0x203
WM_RBUTTONDOWN = 0x204
WM_RBUTTONUP = 0x205
WM_RBUTTONDBLCLK = 0x206
WM_MBUTTONDOWN = 0x207
WM_MBUTTONUP = 0x208
WM_MBUTTONDBLCLK = 0x209
WM_MOUSELAST = 0x20A
WM_MOUSEWHEEL = 0x20A

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.

Zpět do poradny Odpovědět na původní otázku Nahoru