Domanda

Utilizzando l'API Win32 (in C, ma questo non ha importanza) come posso sapere se una determinata finestra (identificata da HWND) ha lo stato attivo? Sto collegando un'applicazione alla ricerca di un evento e quando si verifica l'evento, voglio verificare se l'applicazione ha già lo stato attivo. In caso contrario, voglio far lampeggiare la finestra fino a quando non si concentrano su di essa.

In alternativa, il flag di struttura FlashWindowEx FLASHW_TIMERNOFG che lampeggia fino a quando la finestra non è attiva non lampeggia se la finestra è già attiva? Non posso provarlo ora poiché non mi trovo nel mio ambiente di sviluppo, ma avevo l'impressione che sarebbe comunque lampeggiante, che è quello che sto cercando di evitare.

Modifica: Inoltre, se è importante, l'applicazione utilizza DirectX in questa finestra.

È stato utile?

Soluzione

GetActiveWindow restituirà finestra di livello superiore associata allo stato attivo dell'input. GetFocus restituirà l'handle della finestra che ha lo stato attivo dell'input.

Questo articolo potrebbe essere d'aiuto:
http://www.microsoft.com/msj/0397/Win32/Win320397.aspx

Altri suggerimenti

Oltre a rispondere a gkrogers usando GetActiveWindow, puoi anche mantenere una variabile booleana per la finestra che vuoi sapere se ha lo stato attivo o meno intrappolando WM_SETFOCUS e WM_KILLFOCUS o WM_ACTIVATE

WndProc() ..
case WM_SETFOCUS:
  puts( "Got the focus" ) ;
  break ;

case WM_KILLFOCUS:
  puts( "Lost the focus" ) ;
  break;

case WM_ACTIVATE:
  if( LOWORD(wparam) == WA_ACTIVE )
    puts( "MEGAZORD ACTIVATED kew kew kew (flashy-eyes)" ) ;
  else 
    puts( "I AM NOW INACTIVE." ) ;
  break ;

Intendi veramente " focus " o intendi " attivo? "

Una finestra ha il focus: quella che è la prima in linea per ottenere eventi da tastiera. La finestra esterna (che l'utente può trascinare sullo schermo) è "attiva". se uno dei suoi sottofinestre ha il focus, ma potrebbe o meno avere il focus stesso.

Usa la funzione GetForegroundWindow per ottenere l'Hwnd che stai focalizzando in questo momento. Quindi devi solo confrontarlo con la finestra della tua applicazione per verificare se contiene focus o meno.

Per più bambini non modali: All'interno del Bambino potresti salvare il focus, 13/08/19 VS2017. Puoi salvare lo stato attivo in modo che il genitore sappia su quale bambino non modale è stato fatto clic.

Nel gestore di callback di child:

case WM_CHILDACTIVATE: //only gets called when the child border is click on.
    //CurrentFocus = hDlg; //example : can save the focus globally for parent usage.
    //Beep(2000, 250); // so you can test
break;

case WM_GETMINMAXINFO: //gets called when child window is being moved or sized.
        //Beep(2000, 250);
break;

case WM_LBUTTONDOWN:  //Only called when cursor is inside the child client area
    //CurrentFocus = hDlg; // following the focus.
    //Beep(2000, 250);
break;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top