Diskuze: Divné chování funkce SendInput() [Win32 API]
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Osobně jsem pro tenhle účel kdysi používal funkci keybd_event.
Fajn, díky za tip, zkusím to s tím I když MSDN tvrdí, že je zastaralá a nahrazená právě fcí SendInput. Co s druhým parametrem, bScanCode? Prý to aplikace většinou ingnorují, mám spy-nout LPARAM eventu příchozího z fyzického stisku klávesy a předat ho, nebo je to zbytečný a opravdu se to ignoruje (takže předaná prostá nula bude stačit)?. Jak jsi to používal?
Navíc - tam nepošlu všechny keyeventy naráz jako při sendinput, takže ve smyčce? "nezaspamuju" vstupní frontu? Těch stisků je kolem 20 (max) párů press/release, takže 40 eventů, je rozumný to hodit do smyčky? Někde jsem četl, že práve sendinput tohle nemá úplně nejradši kvůli "spamu" smyčky událostí, že je pak ochotný mi některé eventy zahodit, resp. nezpracovat
Dám vědět, zda pomohlo
Zkus to a uvidíš. Nepamatuju si přesně jak se ta funkce používá, najdi si dokumentaci.
Tak jsem to zkusil s tím keybd_eventem a stále stejný problém.
Zkusil jsem to ještě se C#ovým SendKeys.SendWait z Sys.Win.Forms, a chová se to taky stejně - u mně jo, ale jinde ne.
Ještě mně napadla podstatná maličkost: já si sice forcuju okno kam
potřebuju psát na topmost
pomocí ShowWindow, resp. SetWindowPos (viz ten C# úsek kódu jak si tam
schovávám a ukazuju okno prohlížeče), ale přijde mi, jako by to psal do
okna konzole programu. To by i vysvětlovalo, proč ta SendInput (původní),
ale i všechny další pokusy. Kliknutí je správně, ten combo se rozjede na
browseru (ale taky to je správně, protože na SendClicks předávám handler),
ale úhozy vypadá, že zadává jinam - ty ENTERy na konci si totiž provede
konzolovka sama, nepočká, až je dostane na vstupu.
Nějaký nápad, jak vynutit, aby ten SendInput/keybd_event, whatever se směroval správně?
S těmihle věcmi jsem si nikdy moc nehrál, ale zdá se mi, že tam u posílání proudu klávesových událostí nikde nespecifikuješ okno, kterému se mají doručit (žádné SetForegroundWindows třeba).
Teoreticky by také mohl být problém v tom, že integrity level procesu prohlížeče je vyšší než IL tvého programu (ať už kvůli UI Privilege Isolation nebo proto, že prohlížeč prošel UAC dialogem a tvoje aplikace ne). Ale to je taková hodně teoretická možnost a nepředpokládám, že v ní tkví tvůj problém.
Jo, chybějící SetForegroundWindow(HWND), tam chybí, dopsal jsem ho tam a opravdu se to začíná posílat kam je potřeba (ještě to není dokonalý, prý to hýbe vertikálním posuvníkem stránky a a ne opšnama v comboboxu, ale už snad má správnou cestu). Měl jsem za to, že si ten focus vynutí právě kliknutí na combo, ale tak jsem si to myslel BLBĚ Ještě není úplně dokonale zřejmý, zda je potřeba ten SetForegroundWindow hodit na handler zobrazené karty nebo na jeho rodiče (nemám to jak otestovat, nemám náhradní stroj dneska, ale tak snad se metodou pokusů a omylů konečně (snad po deseti dnech, co tady řeším takovouhle "blbost") dojdeme k funčnímu řešení.
Díky oběma za čas a nápady.
Zobrazeno 7 zpráv z 7.