Hallo zusammen,
ich arbeite gerade an einem Programm mit dem ich Windows Fenster bewegen kann. Mein Ziel ist es ein beliebiges Windows Fenster zu verschieben während ich dabei eine Key Kombination drücke. Dies kann man sich etwa so vorstellen: Ich halte z.B.
Was mir noch Fehlt wäre eine Methode mit der ich die Möglichkeit habe die gedrückten Tasten zu ermitteln, sodass ich dann bei
Der Code ist aktuell noch Quick&Dirty aber es ist zumindest ein Anfang mit dem sich arbeiten lässt
ich arbeite gerade an einem Programm mit dem ich Windows Fenster bewegen kann. Mein Ziel ist es ein beliebiges Windows Fenster zu verschieben während ich dabei eine Key Kombination drücke. Dies kann man sich etwa so vorstellen: Ich halte z.B.
Strg + Alt + L
gedrückt und kann mithilfe der (unbetätigten) Maus das Fenster verschieben. Was ich bereits schaffe ist die Abfrage des aktuellen Fensters MIttels GetForegroundWindow()
, auch kann ich die Fenster Position setzen (das wird später aber durch die MoveWindow()
Funktion ersetzt).Was mir noch Fehlt wäre eine Methode mit der ich die Möglichkeit habe die gedrückten Tasten zu ermitteln, sodass ich dann bei
Strg + Alt + L
das Fenster bewegen kann. Meine Frage richtet sich primär darauf, wie man diese Kombination ermitteln kann? Außerdem habe ich noch eine Subfrage, ich habe das Ganze zunächst in einem Windows Forms Projekt gestartet, ist das eine Gute Idee? Oder ginge auch eine Konsolen Applikation dafür?Der Code ist aktuell noch Quick&Dirty aber es ist zumindest ein Anfang mit dem sich arbeiten lässt
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace MoveActivatedWindow
- {
- public partial class Form1 : Form
- {
- int counter = 0;
- [DllImport("user32.dll")]
- private static extern IntPtr GetForegroundWindow();
- [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
- public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int wFlags);
- [DllImport("user32.dll", SetLastError = true)]
- static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
- [StructLayout(LayoutKind.Sequential)]
- public struct RECT
- {
- public int Left; // x position of upper-left corner
- public int Top; // y position of upper-left corner
- public int Right; // x position of lower-right corner
- public int Bottom; // y position of lower-right corner
- }
- [DllImport("user32.dll", SetLastError = true)]
- internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- counter = 0;
- timer1.Start();
- }
- private void timer1_Tick(object sender, EventArgs e)
- {
- if (counter >= 5) return;
- IntPtr selectedWindow = GetForegroundWindow();
- textBox1.AppendText(selectedWindow + "\n");
- const short SWP_NOSIZE = 0x0001; // Retains the current size (ignores the cx and cy parameters).
- const short SWP_NOZORDER = 0x0004; // Retains the current Z order (ignores the hWndInsertAfter parameter).
- const int SWP_SHOWWINDOW = 0x0040; // Displays the window
- SetWindowPos(selectedWindow, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
- RECT windowRect = new RECT();
- GetWindowRect(selectedWindow, out windowRect);
- textBox1.AppendText(windowRect.Right + " " + windowRect.Left + "\n");
- // TODO:
- // Berechnen der Breite & Höhe (verwende RECT dazu...)
- // Positioniere den Cursor auf die Mitte des akutellen Fensters (verwende zuvor berechnete Höhe/2 & Breite/2)
- // SetCursorPos() ...
- // GetCursorPos() ... Point(x,y)
- // Verwende dann MoveWindow ggf. noch ein Thread ...
- }
- }
- }