c ++ - Modeless dialoger og acceleratorer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil udføre nogle handlinger, når brugeren trykker CTRL+S inde i en modløs dialog.
Acceleratorer ville være perfekte til dette, bortset fra at jeg ikke har kontrol over trådens meddelelsessløjfe (tænk plugin), så jeg kan ikke ringe TranslateAccelerator.


En indlejret meddelelsessløjfe er ikke en mulighed, fordi hovedapplikationen gør en masse behandling mellem opkald til PeekMessage.



  • Er der nogen måde, jeg kan 'tvinge' den eksisterende meddelelsessløjfe til at håndtere min accelerator?

  • Er der nogen anden måde ud over acceleratorer at fange CTRL+S?



Jeg tænkte på at bruge et vindue kroge på WH\_GETMESSAGE, som bliver kaldt før returnering fra GetMessage eller PeekMessage. Men jeg er ikke sikker på, hvad der ville ske, efter at jeg lykkedes at ringe TranslateAcellerator, jeg kan ikke lade programmet vide, at jeg håndterede det.
WH\_MSGFILTER ville kræve, at appen gennemfører et opkald til CallMsgFilter, hvilket det ikke hurtigt overskrider med debugger.


Min sidste ide var at underklassificere kontrollen, som jeg forsøger at undgå. Det ville kræve en vis mekanisme til at signalere tastaturhændelsen til forældrenes vindue, som jeg ikke tror er et godt design. Også, hvis jeg tilføjer flere kontroller, skal jeg underklasse hver eneste.


Tak for eventuelle tip.

Bedste reference


Dette er et temmelig berygtende interop problem, det løser sit grimme hoved også, når du bruger Winforms til at implementere brugergrænsefladen i et indbygget program. Microsofts anbefaling er en hårdtræk: Start din egen tråd for at vise vinduet, så du kan pumpe din egen meddelelsessløjfe. Du skal bruge SetParent () for at undgå Z-order problemer. Skræmmende ting, overveje en modal dialog tre gange, før du forpligter dig til dette.

Andre referencer 1


Kan du bruge WM\_GETDLGCODE? http://msdn.microsoft.com/en-us/library/ms645425(v=vs.85).aspx[11]