[ Neznalica_sa_ugla @ 17.03.2006. 08:24 ] @
Kako najjednostavnije aktivirati hotkey i kada ga se pritisne da on izvrsi neki kod .bio bi zahvalan na nekom kodu . ( Do sada mi niko nikada nije odgovorio niti na jedno pitanje ???? )

[Ovu poruku je menjao Neznalica_sa_ugla dana 17.03.2006. u 09:26 GMT+1]
[ X Files @ 17.03.2006. 09:22 ] @
Sta podrazumevas pod HotKey, odnosno opisi scenario da se 'nesto' pokrene?

Da li si mislio da kada tvoja aplikacija nije aktivna, tj fokusirana, pritisnes
neku kombnaciju tastera, npr Alt+nest koja izvrsava neki kod, ili si mislio na
nesto sasvim drugo.

Na primer pogledaj:
RegisterHotKey()
http://msdn.microsoft.com/libr...0/html/cerefRegisterHotKey.asp


ili

jos bolje resenje bi bilo sa takozvanim Global Keyboard Hook mehanizmom, koji
podrazumeva poseban DLL koji vrsi monitorinj tastature.
[ Neznalica_sa_ugla @ 17.03.2006. 09:37 ] @
Ma gledao i to dugo , nije bilo koristi . Ovako sam zamislio : recimo imate prozor u njemu nekoliko kontrola : textedit, listbox, kada ste u edit kontroli i kucate tekst ,ali ako pritisnete strelicu prema dolje da vam se izvrši neki kod ( ponude opcije , skoci u drugi edit , napise neka poruka o vašemu unesenom tekstu .... ) sve zavisi sta radi taj dio koda koji se pokrece kada pritisnete taj botun , napominjem kada ste u kontroli edit da "regularno " ne napušta kontrola ,nego morate kliknuti mišom , ( ovdje mis otpada) to treba obaviti tastaturom. itd...
[ X Files @ 17.03.2006. 09:45 ] @
To vec nije posao za HotKey niti za GlobalKeyboardHook()

Radi se o obicnim dogadjajima vezanim za tastaturu: OnKeyDown, OnKeyUp,
OnKeyPress, i sl... i utoliko je sve lakse.

E sad koji IDE/komajler koristis pa da ti neko da kod.

[ Neznalica_sa_ugla @ 17.03.2006. 10:00 ] @
radim u cpp , platforma SDK i ( koliko ja znam ne mogu se obradjivati takvi dog. ako mogu ,kao??? )
obradjujem samo poruke WM_KEYPRESS , WM_KEYUP ... ALI NJIH Prozor ne prosljedjuje kada ste u kontroli , zato mislim da bi bilo rjesenje hotkey da taj kod se izvrsi pa u njemu raditi sta reba ( program mije prevelik za slanje )
[ stargazer @ 17.03.2006. 11:02 ] @
ako sam dobro shvatio čoveka, njemu edit kontrola ne prosleđuje WM_KEY* poruke u glavni prozor, pa mu je to problem
i ne može da ih obradi

taj problem možeš da rešiš pomoću Subclassing-a, pa da direktno obrađuješ poruke te kontrole bez obzira na prozor u kome se kontrola nalazila

pošalji program

[Ovu poruku je menjao stargazer dana 18.03.2006. u 02:15 GMT+1]
[ X Files @ 17.03.2006. 18:57 ] @
Kursori se bez problema hvataju u TEdit komponenti kod BCB-a:
(miclim da bi i kod M$-a trebalo da bude isto)

na primer, za gore:
Code:

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   if ( Key == VK_UP )
      ShowMessage( "Gore" );        
}


Ali koliko se secam hvatanje TAB-a je problematicno, ali se i to resava, npr:
Code:


--- H ---

    private:  // User declarations
        void __fastcall AppMessage( TMsg &Msg, bool &Handled );
    public:   // User declarations
        __fastcall ~TForm1();

--- CPP ---

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    Application->OnMessage = AppMessage;
}
__fastcall TForm1::~TForm1()
{
    Application->OnMessage = NULL;
}
void __fastcall TForm1::AppMessage( TMsg &Msg, bool &Handled )
{
    if ( Msg.message == WM_KEYDOWN || Msg.message == WM_KEYUP )
    {
        if ( Msg.wParam == VK_TAB )
        {
           if ( dynamic_cast<TEdit*>( Screen->Active->Control ) )
           {
              Msg.wParam = VK_RETURN;
           }
        }
    }
}

[ Neznalica_sa_ugla @ 18.03.2006. 13:54 ] @
Hvala X-file na trudu , ali to mi ne rjesava problem. Ako mogu na eki e-mail da ti spremim dio koda da pogledas, onda bi bilo jasno o cemu se radi. Ovako ne ide . No svjedno jos jednom hvala na trudu.
[ stargazer @ 18.03.2006. 22:13 ] @
video sam šta si pravio u onome što si poslao i koliko sam video, sve je manje više u redu
rešenje za tvoj problem je Subclassing ( podklasovanje ), zamena originalne procedure prozora sa nekom sopstvenom:

e sad, koliko sam video treba ti za EDIT kontrolu, pa ću ovde da navedem za nju, ali opšti princip i dalje važi za ostale, s time što za neke kontrola treba pogledati i dokumentaciju - npr. COMBOBOX u zavisnosti od stila, šalje WM_KEYDOWN poruku svojoj listi koja je njen podređeni prozor ( CBS_DROPDOWNLIST ), a u ostalim slučajevima ( CBS_DROPDOWN i CBS_SIMPLE ) svojoj podređenoj edit kontroli, tako da treba u stvari podklasovati odgovarajuću podređenu kontrolu

evo kako to izgleda :

po pozivu funkcije CreateWindowEx za prozor (hEditWnd ) koji se želi podklasovati, potrebno je pozvati funkciju SetWindowLong na sledeći način :

Code:

OldWndProc = (WNDPROC)SetWindowLong(hEditWnd, GWL_WNDPROC, (LONG)NewWndProc);


gde je OldWndProc promenljiva tipa WNDPROC, a NewWndProc :

Code:

// ovde je stavljeno da se pri pritisku na ENTER menja fokus kontrole

LRESULT CALLBACK NewWndProc(HWND hEditWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
   if (Msg == WM_KEYDOWN)
       if ((int)wParam == VK_ENTER)
       {
           SetFocus(hNaredniEditWnd);
           return 0;
       }

   return CallWndProc(OldWndProc, hEditWnd, Msg, wParam, lParam);
}

...

// i pre poziva DestroyWindow za podklasovani prozor :
SetWindowLong(hEditWnd, GWL_WNDPROC, (LONG)OldWndProc);
DestroyWindow(hEditWnd);



Dakle, u suštini ti samo presrećeš poruke upućene ovom prozoru i šalješ i na defaultno procesiranje u OldWndProc pozivom CallWndProc.

Na ovaj način se bilo koji prozor može podklasovati.



[Ovu poruku je menjao stargazer dana 18.03.2006. u 23:18 GMT+1]
[ Neznalica_sa_ugla @ 20.03.2006. 11:38 ] @
Hvala stargazer , ovo mi doista pomaze , nisam jos sve implementirao ,ali cini mi se da ce biti ok!!