Du burde kunne bruge følgende: <code> #include <windows.h> #include <stdlib.h> #include <stdio.h>
int main(int argc, char *argv[]) { HWND handle; int i;
if(argc != 2) { fprintf(stderr, "You must specify a window title (and nothing else)\n"); return EXIT_FAILURE; } SetConsoleTitle(argv[0]); /* We don't want FindWindow to find us */
if((handle = FindWindow(NULL, argv[1])) == 0) { fprintf(stderr, "Did not find your window\n"); return EXIT_FAILURE; } SetForegroundWindow(handle);
for(i = 0; i < 30; i++) { printf("."); fflush(stdout); Sleep(1000); } return EXIT_SUCCESS; } </code> Du kalder programmet med titlen på det program du vil "task switch'e" til som parameter. Titlen er normalt det der står i det blå feldt øverst i vinduet.
Formålet med loopen med Sleep er udelukkende at vise at programmet fortsætter efter det har sat det andet program i forgrunden.
Umiddelbart virker det godt nok - eneste lille minus er...
Hvis det vindue man vil vælge er minimeret - så forbliver det minimeret - men aktivt på proceslinien...
En anden lille ting: Kunne det ikke laves så det var procesnavnet - fra task mannager man kunne bruge? istedet for titlen på vinduet? Den bliver nem kringlet...
Den første del (hvis vinduet er minimeret) er ret let at løse, du indsætter disse to linier efter SetForegroundWindow(...): if(IsIconic(handle)) ShowWindow(handle, SW_RESTORE);
Den anden del er lidt mere besværligt, jeg vil se på det i aften.
Jeg har foreløbigt fundet ud af at det ikke er nemt at bruge process navnet, da der ikke er nogen let mapning mellem et process-navn og vindue. Jeg har dog ikke opgivet at finde en løsning.
Jeg har nu lavet en løsning hvor man angiver navnet på programmet (f.ex word.exe). Løsningen virker en anelse kringlet, og jeg er ikke sikker på at der ikke findes en enklere løsning, men det ser dog ud til at virke. Når du bygger programmet skal du linke med Psapi.lib, kommandoen for BorlandC ser sådan ud: bcc32 PSDK\Psapi.lib ps.c
int main(int argc, char *argv[]) { if(argc != 2) { printf("You have to specify which program you want to bring to front\n"); return EXIT_FAILURE; } EnumWindows(EnumWindowsProc, (LPARAM )argv[1]); if(!MatchingHWnd) { printf("Did not find the window\n"); return EXIT_FAILURE; } SetForegroundWindow(MatchingHWnd); if(IsIconic(MatchingHWnd)) ShowWindow(MatchingHWnd, SW_RESTORE);
Jeg har rodet lidt mere med projectet og fundet ud af den metode der er brugt i de to sidste kode eksempler ikke er sikker. Problemet er at en process godt kan have mere end et top level vindue, selv om der kun kører en instans af programmet. Det gør det lidt svært at finde ud af hvilket vindue der skal skiftes til. Den første metode (hvor man finder vinduet vha vindues titlen) er sikker, men gør at man skal kende titlen på vinduet. Man kan evt indsætte følgende efter SetForegroundWindow(handle), hvis man vil håndtere minimerede vinduer:
if(argc != 2) { printf("You have to specify which program you want to bring to front\n"); return EXIT_FAILURE; } EnumWindows(EnumWindowsProc, (LPARAM )argv[1]); if(!MatchFound) { printf("Did not find the window\n"); return EXIT_FAILURE; }
Forskellen fra de tidligere versioner er at man restorer alle vinduer der stammer fra program navnet, hvis de har en titel. Metoden er statig ikke helt sikker, men dog bedre end de tidligere.
Rart at der er nogen der vil hjælpe uden belønning :-)
Igen - mange tak for hjælpen :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.