Qt c++ prenest event do okna jineho programu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Qt c++ prenest event do okna jineho programu – C / C++ – Fórum – Programujte.comQt c++ prenest event do okna jineho programu – C / C++ – Fórum – Programujte.com

 

peter
~ Anonymní uživatel
3981 příspěvků
20. 5. 2015   #1
-
0
-

Potreboval bych prenest event z meho okna do okna jineho programu. Pisu program v QT.

// mainwindow.cpp
//void MainWindow::on_pushButton_clicked()
//{
QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_F1, Qt::NoModifier, "Red", 0);
QApplication::postEvent(this, event);
//}

- toto vyvola event stisku F1 a odesle jej do me aplikace (this)
- ja bych to potreboval prenest mimo aplikaci, do jine

Vubec netusim, jak na to, zatim. Chystam se to googlovat. Kdyby jste s tim nekdo mel zkusenosti, moc by mi to pomohlo.

Jedna se o to, ze kolegovi se jeden program pri necinnosti okna odhlasuje. Coz je ok. Ale nastane tam nejaka chyba, ze kdyz se pokusi pracovat a je odhlaseny, tak nez se overi, ze neni prihlaseny, tak cely ten program asi 5 min je mrtvej. Pak to slavnostne prohlasi, ze uzivatel neni prihlaseny a nabidne moznost se prihlasit. tak to chce obchazet tim zpusobem, ze v tom okne zmacne nejakou nevinnou klavesu.
On s tim pracuje tak, ze chvili neco hleda. Pak treba 5-20 min dela neco jineho. A chce pokracovat v hledani. A nad nim stoji clovek, ktery to nutne potrebuje a ted oba cekaji, nervozita stoupa....

Podobny princip se da samozrejme uplatnit jako pomocnik pri hrani her, ktery macka klavesy :) Ale to neni ted zamysleny cil.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:a946:94...–
KIIV
~ Moderátor
+43
God of flame
20. 5. 2015   #2
-
0
-

Muzes posilat zpravy (ve Windows winapi).. Ziskas handle okna toho programu a na ten handle pak budes posilat stisky klaves.

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
3981 příspěvků
20. 5. 2015   #3
-
0
-

No, vis, ve QT to pisu od vcera. Moc by bodl priklad kodu pro okno firefox a klavesu F1, treba. Principialne to chapu.
Po vcerejsim celodennim googlovani jsem vyplodil program, co po stisku tlacitka spusti casovac a vyvola klavesu F1   :) Ted uz byva to jen nasmerovat na jine okno.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:a946:94...–
KIIV
~ Moderátor
+43
God of flame
20. 5. 2015   #4
-
0
-

Kdyby ta aplikace byla jen webova stranka, tak bych vyuzil spis nejaky autoreload.

Pokud to bylo mysleno jen jako priklad, a aplikace je neco placeneho, tak bug report jako pomerne hnusna chyba.

+ se zeptat, jestli jde ten timeout vypnout ci aspon prodlouzit.

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
3981 příspěvků
20. 5. 2015   #5
-
0
-

Ty ses marny :) Uz v prvnim prispevku jsem se pokousel vysvetlit zhruba oco go. Vim, ze je to nejaky bug, vim, ze by si to mel resit s podporou. Pripadne hledat chybu, proc mu to dela na uplne ciste preinstalovanem pc. Ale proste mne pozadal o to, udelat takovy program.
Zatim jsem nasel simulaci pomoci windows.h . Jsem cekal, ze mi to na plose spusti napovedu a dela to totez jako to qt, spusti mi to F1 uvnitr meho programu

// key pomoci QT
QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_F1, Qt::NoModifier, "Red", 0);
QApplication::postEvent(this, event);

// key pomoci "windows.h"
// key_codes https://msdn.microsoft.com/…s927178.aspx
#include "windows.h" keybd_event;
keybd_event(VK_F1, 0, 0, 0);
keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0);
 

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:a946:94...–
20. 5. 2015   #6
-
0
-

Nejjednodušší se mi zdá naučit uživatele aby se z programu vždy odhlásil a pak znovu přihlásil - nenechával program nečinný s přihlášeným uživatelem. Dále je zde riziko, že když je okno programu minimalizované, může vinou chyby v programu zpomalit zpracovávání smyčky zpráv nebo ho úplně přerušit. Další věc je co se stane když oknu pošleš zprávu odpovídající stisku klávesy, možná "vyleze" do popředí a bude tak uživateli znesnadňovat práci s jinou aplikací.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
3981 příspěvků
20. 5. 2015   #7
-
0
-

Tak to se necham prekvapit, az najdu potrebny kod. Ale jsou to dobre poznamky.

Tatka ma prave neco podobne v Dephi. Jenze to je placena vec a nemam to tady. Ma na pc tv a tam na nekterych kanalech vyskoci jakasi hlaska. Coz by bylo ok, kdyz bys pak na ovladaci nemusel hledat mrnavou klavesu Exit. Takze si udelal programek, ktery posila exit do te aplikace, Protoze jinak je to neskodne. Ale to je jiny pripad, u tv je vetsinou nastavene, ze prekryva obraz vsechno. A navic focus je na tu tv, takze nevadi, ze to focusne na ni zas.

Mozna pujde kontrolovat, zda je focus na to okno a kdyz jo, tak nic a kdyz ne, tak z nej focusnout na to jine, na kterem je focus. Ale je fakt, ze to je dost neprijemne. par aplikaci mi to dela, zvlast pri startu win, kdyz naklikam otvirat asi 5 veci. Pisu si takhle pak heslo do jedne a najednou se focusne jina a pisu zbytek hesla do ni :)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:a946:94...–
peter
~ Anonymní uživatel
3981 příspěvků
21. 5. 2015   #8
-
0
-

 Nasel jsem neco takoveho. Otevre mi to notepad, spusti F1, napovedu. Ted jeste neco, co mi zjisti window-name pro jiny program, protoze treba kdyz zadam firefox, tak ani v jednom z 30 oken mi to neotevre napovedu. Na druhou stranu, ted koukam, ze ani po zmacknuti F1 rucne se nic neotvira, takze to mozna neni ten problem :)

    #include "windows.h"
     
     HWND mywindow; uint keyCode;
     QString str;
     
        str = 'notepad';
        wchar_t* name = new wchar_t[str.length() + 1];
        str.toWCharArray(name);
        mywindow = FindWindow(name,0);
        SetForegroundWindow(mywindow);
        keyCode = VK_F1; // F1 key
        //uint keyCode = PP_DATA.key;
        PostMessage(mywindow, WM_KEYDOWN, keyCode, 0); // key down
        PostMessage(mywindow, WM_KEYUP, keyCode, 0); // key up
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:14e0:f0...–
peter
~ Anonymní uživatel
3981 příspěvků
26. 5. 2015   #9
-
0
-

Uz mne trapi jen posledni vec.

Ze keySequenceEdit inputu potrebuji prevest klavesovou zkratku na kod VK_. Kdyz si to dam zobrazit, tak mi to vypisuje divotvorna cisla 16777268 a 116. Prvni je kod pro Qt::Key_F5, druhe pro VK_F5.

uint keyCode;
QKeySequence seq;
seq = QKeySequence::fromString(PP_DATA.key); // PP_DATA.key = "F5"keyCode = seq[0];
MainWindow::statusWrite(QString::number(keyCode)+' '+QString::number(VK_F5));

Nasel jsem, ze by slo pouzit konverzi pres QKeyEvent a jeho nativeVirtualKey(), ale to bych se musel dostat k eventu keySequenceEdit, ktery je protected podle dokumentace. A nebo nejak prevest tu klavesovou zkratku do keyeventu. Coz vubec netusim jak. Umim to zatim prevadet jen na cislo nebo na string.

Prozatim to vypada tak, ze si vytvorim prevodni tabulku, asi, pro nekolik klaves, ktere by mohl kolega pouzit a doufat, ze netrefi zadnou, co v tabulce nemam :) Teoreticky rikal, ze staci F7, ale chtel jsem mu to udelat trochu univerzalni.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:f9a7:2c...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 24 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý