Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: C, Windows: Fokuksen palautus edelliseen ikkunaan

Puhveli [02.04.2011 12:34:27]

#

Ohjelma käynnistyy näppäimistön nappia painamalla ja lähettää sarjan näppäinpainalluksia auki olleeseen ikkunaan.

Käynnistyessään ohjelma ikävä kyllä pomppaa päällimmäiseksi, ja haluaisin palauttaa fokuksen edelliseen auki olleeseen ikkunaan SetForegroundWindow():lla.

Tämä toimii tietenkin vain rajatuissa tapauksissa:

HWND dstWindow = FindWindow(0, "Nimetön - Muistio");
SetForegroundWindow(dstWindow);

Kysymys:
- Kuinka siis saan edellisen ikkunan aktivoitua sillonkin, kun sen otsikko ei ole tunnettu,
- tai vaihtoehtoisesti ohjelmani pysymään aina taustalla ottamatta koskaan fokusta itselleen?

Yritin lähettää Alt+Tabia keybd_event():llä, mutta valikon sulkeuduttua (kun Tab vapautetaan) fokus ei vaihdukaan valikosta valittuun ikkunaan, niin kuin se vaihtuisi, jos käyttäjä olisi nuo napit käsin painanut.

Metabolix [02.04.2011 13:19:17]

#

Jos et tarvitse ohjelmallesi käyttöliittymää, paras ratkaisu on tehdä ohjelma, joka ei avaa minkäänlaista ikkunaa. Käytännössä täytynee valita projektin tyypiksi GUI tai lisätä GCC:lle parametri -mwindows. En nyt muista tarkkaan, mutta voi olla, että joudut väistämättä myös vaihtamaan pääohjelmaksi WinMain-funktion. Se ei onneksi ole iso vaiva:

#include <stdlib.h>
#include <windows.h>

int CALLBACK WinMain(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR lpCmdLine,
  int nCmdShow
) {
  return main(__argc, __argv);
}

Jos käyttöliittymä on ihan välttämätön etkä voi hakea päällimmäistä ikkunaa ennen oman ikkunan avaamista, voit ehkä tehdä jotenkin tähän tapaan:

HWND GetTargetWindow() {
  HWND hwnd = GetForegroundWindow();
  while (hwnd && hwnd == omaikkuna) {
    hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
  }
  return hwnd;
}

Puhveli [02.04.2011 21:21:50]

#

Kiitos, sovellan jälkimmäistä, vaikuttaa lupaavalta. Ei ole paljoa kokemusta Windowsin API:sta, koska pyrin aina portattavuuteen, ja taas tuli opittua hyödyllinen ja aika ilmeinen funktio ja sen käyttö.

Olen tehnyt SDL:llä graafisia kikkareita -wmindows-flagilla (SDL:hän vaihtaa mainin WinMainiks), ja muistaakseni silloinkin myös konsoli-ikkuna näkyy ohjelmaa suoritettaessa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta