Zdravím,
nenašel by se tu někdo, kdo by mi mohl poradit, jak zachytit klávesu "Enter", když focus má editbox? Už si vážně nevím rady. Nic z toho, co jsem zkoušel mi nefunguje.
case WM_KEYDOWN:
if(wParam == VK_RETURN)
{
GetDlgItemText(hwnd, ID_TEXTBOX, buffer, 255);
SendMessage(listbox, LB_ADDSTRING, 0, (LPARAM) buffer);
}
break; // <^ - Toto funguje pouze, když má focus hlavní okno...
1) Pokud máš hlavní okno typu dialog, tak stačí zachytávat ve WM_COMMAND příchozí IDOK (ani nemusí být na dialogu odpovídající tlačítko) a tam rozhodovat, co uděláš podle toho, kdo má fokus
2) Pokud máš hlavní okno klasické, tak je jedna rychlejší metoda (lze zjistit přes Spy++). Stačí nastavit tomu tvému editačnímu políčku ještě styl ES_MULTILINE a ES_WANTRETURN. Při stisku Enter v tomto editačním políčku ti přijde mimo jiné i notifikace EN_MAXTEXT ... něco ve smyslu:
3) A jeden z posledních způsobů je subclassing. Prostě tomu editačnímu políčku podstrčíš jinou funkci, která zpracovává zprávy pro něj příchozí. Tam zachytíš WM_KEYDOWN nebo jinou zprávu a pošleš si do hlavního okna vlastní notifikaci. Dokonce můžeš vytvořit speciální typ ovládacího prvku, který si bude držet pozici kurzoru za tím textem "Command >", bude sám mazat potvrzený příkaz a pošle nejenom notifikaci, ale rovnou ten příkaz (třeba jako WM_COMMAND nebo WM_USER). Na oko je to pracnější, ale máš to kompletně pod kontrolou.
#2liborb
Asi něco dělám špatně, ani jedna metoda mi nefungovala, pokaždé, když něco napíšu do editboxu a stisknu enter, tak to pouze pípne, ale jinak se nic nestane. U té druhé metody navíc nevim, co je wmID a wmEvent, takže tu jsem musel prozatím vypustit...
Příklad první a druhé možnosti (na aplikaci generované VS). První možnost je schovaná v dialogu O aplikaci a druhá je v hlavním okně (i s minimální reakcí).