Avatar billede mcnovy Nybegynder
15. november 2007 - 01:35 Der er 5 kommentarer og
1 løsning

hvordan laver man et program som alt+tab

Hej,

Jeg vil gerne rent software mæssigt kunne skifte mellem applikationer, er der nogen der som overskriften siger,
eller på anden måde kan give nogle hint som kan hjælpe mig på vej..?

på forhånd tak...
Avatar billede mr-kill Nybegynder
15. november 2007 - 04:01 #1
Hvis du skal lege med "frammede" vinduer så skal du ha fat i user.dll i windows APi'et. De metoder jeg vil anbefale dig at kigge på er: ShowWindow og SetForegroundWindow. Der ligger mange andre metoder til alt muligt andet gøjl hvis du vil bygge videre (http://www.pinvoke.net/ og så under user32).

Dette eksempel bruger kun SetForegroundWindow til at vise et vindue du ønsker. hvis du vil maksimere ol. skal du ha fat i ShowWindow. Programmet finder de vinduer der er åbnet på din computer og ligger dem i en liste, når du så klikker 2 gange så skifter den til det. Det skal lige siges at listen ikke opdateres løbende, så hvis det program du forsøger at klikke på er lukket igen så kan den ikke skifte til det ;)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace WindowHandler
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            this.listView1 = new ListView();
            this.columnHeader1 = new ColumnHeader();
            this.columnHeader2 = new ColumnHeader();
            this.SuspendLayout();
            //
            // listView1
            //
            this.listView1.Columns.AddRange(new ColumnHeader[] {
            this.columnHeader1,
            this.columnHeader2});
            this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.listView1.FullRowSelect = true;
            this.listView1.GridLines = true;
            this.listView1.Location = new Point(0, 0);
            this.listView1.Name = "listView1";
            this.listView1.Size = new Size(284, 264);
            this.listView1.TabIndex = 0;
            this.listView1.UseCompatibleStateImageBehavior = false;
            this.listView1.View = View.Details;
            this.listView1.MouseDoubleClick += new MouseEventHandler(this.listView1_MouseDoubleClick);
            //
            // columnHeader1
            //
            this.columnHeader1.Text = "#";
            //
            // columnHeader2
            //
            this.columnHeader2.Text = "Navn";
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 264);
            this.Controls.Add(this.listView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private IContainer components = null;
        private ListView listView1;
        private ColumnHeader columnHeader1;
        private ColumnHeader columnHeader2;
        private enum WindowShowStyle : uint
        {
            /// <summary>Hides the window and activates another window.</summary>
            /// <remarks>See SW_HIDE</remarks>
            Hide = 0,
            /// <summary>Activates and displays a window. If the window is minimized
            /// or maximized, the system restores it to its original size and
            /// position. An application should specify this flag when displaying
            /// the window for the first time.</summary>
            /// <remarks>See SW_SHOWNORMAL</remarks>
            ShowNormal = 1,
            /// <summary>Activates the window and displays it as a minimized window.</summary>
            /// <remarks>See SW_SHOWMINIMIZED</remarks>
            ShowMinimized = 2,
            /// <summary>Activates the window and displays it as a maximized window.</summary>
            /// <remarks>See SW_SHOWMAXIMIZED</remarks>
            ShowMaximized = 3,
            /// <summary>Maximizes the specified window.</summary>
            /// <remarks>See SW_MAXIMIZE</remarks>
            Maximize = 3,
            /// <summary>Displays a window in its most recent size and position.
            /// This value is similar to "ShowNormal", except the window is not
            /// actived.</summary>
            /// <remarks>See SW_SHOWNOACTIVATE</remarks>
            ShowNormalNoActivate = 4,
            /// <summary>Activates the window and displays it in its current size
            /// and position.</summary>
            /// <remarks>See SW_SHOW</remarks>
            Show = 5,
            /// <summary>Minimizes the specified window and activates the next
            /// top-level window in the Z order.</summary>
            /// <remarks>See SW_MINIMIZE</remarks>
            Minimize = 6,
            /// <summary>Displays the window as a minimized window. This value is
            /// similar to "ShowMinimized", except the window is not activated.</summary>
            /// <remarks>See SW_SHOWMINNOACTIVE</remarks>
            ShowMinNoActivate = 7,
            /// <summary>Displays the window in its current size and position. This
            /// value is similar to "Show", except the window is not activated.</summary>
            /// <remarks>See SW_SHOWNA</remarks>
            ShowNoActivate = 8,
            /// <summary>Activates and displays the window. If the window is
            /// minimized or maximized, the system restores it to its original size
            /// and position. An application should specify this flag when restoring
            /// a minimized window.</summary>
            /// <remarks>See SW_RESTORE</remarks>
            Restore = 9,
            /// <summary>Sets the show state based on the SW_ value specified in the
            /// STARTUPINFO structure passed to the CreateProcess function by the
            /// program that started the application.</summary>
            /// <remarks>See SW_SHOWDEFAULT</remarks>
            ShowDefault = 10,
            /// <summary>Windows 2000/XP: Minimizes a window, even if the thread
            /// that owns the window is hung. This flag should only be used when
            /// minimizing windows from a different thread.</summary>
            /// <remarks>See SW_FORCEMINIMIZE</remarks>
            ForceMinimized = 11
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Process[] all_process = Process.GetProcesses();

            int i = 1;
            foreach (Process p in all_process)
            {
                if (p.MainWindowTitle != "")
                {
                    listView1.Items.Add(new ListViewItem(new string[]{i.ToString(), p.MainWindowTitle}));
                   
                    i++;
                }
            }
        }
        private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            ListViewItem item = listView1.HitTest(e.Location).Item;

            object o = getProcessByName(item.SubItems[1].Text);

            if (o != null)
            {
                Process p = (Process)o;
                SetForegroundWindow(p.MainWindowHandle);
            }
           
        }
        private object getProcessByName(string name)
        {
            Process[] all_process = Process.GetProcesses();
            foreach (Process p in all_process)
            {
                if (p.MainWindowTitle == name)
                    return p;
            }

            return null;
        }

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);

        [DllImport("user32.dll")]
        private static extern int SetForegroundWindow(IntPtr hWnd);
    }
}


Hvis du har spørgsmål til koden eller skal ha andet hjælp for at komme videre så skriver du bare igen ;)
Avatar billede mcnovy Nybegynder
16. november 2007 - 03:30 #2
super..
jeg takker, smid et svar, så for du dine point...

dog lige een ting..
using System.Linq;

hvorfor er linq includederet..?
er linq ikke database og XML... :|

og ved du evt om denne også understøtter muligheden for at hente ikonet fra programmerne også, så de også kan blive vist..?

og igen, så tak for hjælpen
Avatar billede mr-kill Nybegynder
16. november 2007 - 10:02 #3
sorry
using System.Ling; behøves ikke. Det er bare fordi jeg bruger VS2008 og der er den med som standart.

Jeg tror godt du kan få ikonet på et vindue, er bare ikke helt sikker på hvordan. Hvis du bruger vista så kan du kigge på dwmapi.dll, den kan lave en masse sjov med vinduer.
Avatar billede mr-kill Nybegynder
16. november 2007 - 12:43 #4
Hvis det er til vista så ta' et kig på dette: http://community.bartdesmet.net/blogs/bart/archive/2006/10/05/4495.aspx
Avatar billede mr-kill Nybegynder
17. november 2007 - 00:10 #5
Nu er jeg ikke så sej til tysk, men C# er heldigvis eng :P

Tror måske du kan bruge dette:
http://codesnips.co.funpic.de/index.php?option=com_content&task=view&id=30&Itemid=31
Avatar billede mcnovy Nybegynder
17. november 2007 - 03:03 #6
det er noget der skal fungere til alle .net kompatible op.systemer, selvom nogle af de visuelle features som der er i vista kunne være meget fedt at benytte.
men ihvertfald, så takker jeg for hjælpen, og det med ikonet skulle være til at søge sig til når man nu bare ved nogenlunde hvad man skal søge efter...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester