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.
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; }
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.