Ako prečítať celý obsah schránky vo windows? rubrika: Programování: C/C++

7 xxar3s
položil/-a 3.10.2020
 
upravil/-a 3.10.2020

Myslím tým úplne všeto čo sa aktuálne nachádza v schránke, všetky druhy formátov. Na nete som našiel iba príklady ako prečítať jednotlivé formáty, lenže ja by som potreboval prečítať všetko čo sa nachádza v schránke a premiestniť to do mojej appky (a vôbec to nepotrebujem zobraziť ani s tým manipulovať). Viem že také niečo možné je, nakoľko existujú ClipboardReadery napr FreeClipViewer a tie dokážu zobraziť všetko čo je v schránke dokonca aj custom formáty niektorých programov (tie zobrazia len ako ascii znaky). Žiaľ FreeClipViewer neni open source.

Ja viem zistiť, ktoré formáty mám aktuálne v schránke, pomocou EnumerateFormats, ale už nepoznám univerzálny spôsob ako tie formáty prečítať. Viem získať pointer na formát pomocou GetClipboardData, ale už nie veľkosť bloku dát, ktorý mám prečitať. Lebo pri každom formáte sa to robí inak, pri textoch sa prečíta buď nullterminated string (zakočnený znakom \0) alebo sa zistí veľkosť stringu funkciou GlobalSize (ak chceme mať v stringu aj \0). Toto, ale nefunguje pri obrázkoch tam treba prečítať hlavičku Bitmapy a až z tej vieme zistiť aký objem dát treba prečítať. Pokiaľ, ale tie formáty nechcem zobrazovať iba niekam ukladať tak je to zbytočný overkill a na custom formáty sa to nedá použiť.

Takže ak niekto pozná spôsob ako na to tak prisím sem s ním. Ja skúsim pohľadať nejaké zzdrojáky appiek pracujúce so schránkou na githube.

odkaz
3 jancotomas
odpověděl/-a 5.10.2020
 
upravil/-a 5.10.2020

Velkost bloku dat v clippboarde je vzdy zistitelna cez GlobalSize(), pre kazdy format.
Nemozes verit ziadnym hlavickam alebo terminatorom ulozenym v tych datach.
Tie mozu byt naschval zmanipulovane a potom mas krasny buffer overflow.

Komentáře

  • xxar3s : Počkaj toto som už skúšal a práveže to fungovalo iba pri niektorých formátoch (pri textových to funguje určite). Idem to ešte raz odtestovať (či som tam neurobil niekde chybu keď som to predtým testoval). Ak by si mal pravdu tak mám po probléme, ale n 90% myslím že ju nemáš :( 5.10.2020
  • xxar3s : Testujem to opäť, chcel som vytiahnuť obrázok zo schránky, ktorý som tam uložil programom Paintbrush. Na vedlajšom monitore mám pre kontrolu zapnutý program Free Clipboard Viewer aby som si overil či tam fakt sú tie formáty čo očakávam. Taktiež si ich potom nechám vypísať pomocou EnumerateFormats. Pre CF_BITMAP sa mi pri zavolaní GlobalSize vyhodí chyba CLIPBRD_E_CANT_OPEN pri CF_DIB to funguje tak ako treba. Takže nedá sa to použiť na všetky formáty čo sú v schránke aj keď situácia je o niečo lepšia ako som si myslel, GlobalSize funguje aj na iné ako textové formáty. Ale nechápem tú chybu CLIPBRD_E_CANT_OPEN prečo mi to vypisuje keď Clipboard otváram v Konštruktore mojej classy (volám OpenClipboard) cez RAII potom uvoľňujem prostriedky CloseClipboard (v deštruktore). Premýšľam prečo to tak je či to neni tým že OpenClipboard volám s parametrom nullprt teda: OpenClipboard(nullptr) nemal by som mu predať hwnd okna? Intuícia mi hovorí že v tom problém nebude lebo pre CF_DIB to funguje, každopádne už som tak bezrandý že mu asi skúsim dať ako parameter hwnd okna. 5.10.2020
  • xxar3s : A práve som vygooglil dôvod prečo to tak je https://stackoverflow.com/questions/49692837/globalsize-function-used-on... každopádne ďakujem ti za pomoc, lebo ajtak som sa (nepriamo) vďaka tvojej odpovedi a opätovnému testovaniu posunul ďalej. 5.10.2020

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.