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 ;)