diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1feae78 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a5d3be1 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ + +CSC=csc +CSC=mcs + +PROG=wmctrl.exe + + + +all: $(PROG) test + +$(PROG): wmctrl.cs + $(CSC) wmctrl.cs + + +test: + $(PROG) -h + $(PROG) -l + $(PROG) -a gvim diff --git a/_dev/CommandLineArgs.cs b/_dev/CommandLineArgs.cs new file mode 100644 index 0000000..0c893a8 --- /dev/null +++ b/_dev/CommandLineArgs.cs @@ -0,0 +1,56 @@ +using System; + +public class CommandLine +{ + public static int SwitchToWindow(){ + Console.WriteLine("SwitchToWindow"); + return 0; + } + + public static int ListWindows(){ + Console.WriteLine("ListWindows"); + return 0; + } + + + public static int Main(string[] args) + { + int status=0; // Return status for Main + + // -------------------------------------------------------------------------------- + // --- Parsing arguments + // -------------------------------------------------------------------------------- + int nArgs=args.Length; + Console.WriteLine("Number of command line parameters = {0}", args.Length); + + int i=0; + while (i +using System.Windows.Forms; // SendKeys +// using System.Threading; // For Thread.Sleep + +class Program +{ + //dll import (can't be in method, but needs to be in class + [DllImport("user32.dll")] + public static extern int SetForegroundWindow(IntPtr point); + static void Main() + { + // -------------------------------------------------------------------------------- + // --- + // -------------------------------------------------------------------------------- + Process p = Process.Start("notepad.exe"); + p.WaitForInputIdle(); + IntPtr h = p.MainWindowHandle; + SetForegroundWindow(h); + SendKeys.SendWait("k"); +// Thread.Sleep(1000); + IntPtr processFoundWindow = p.MainWindowHandle; + } +} diff --git a/_dev/SwitchWindow.cs b/_dev/SwitchWindow.cs index 6f909be..34d9484 100644 --- a/_dev/SwitchWindow.cs +++ b/_dev/SwitchWindow.cs @@ -1,48 +1,41 @@ -//declarations -using system.IO; -using System.Runtime.InteropServices; -using System.Diagnostics; -//more - -//namespace here - -//class here - -//initialize method +// //declarations +using System; // For IntPtr +using System.Runtime.InteropServices; // DllImport +using System.Diagnostics; // Process +// using System.Windows.Automation; // UIAutomationClient.dll +// using System.Threading; // For Thread.Sleep class Program { + //dll import (can't be in method, but needs to be in class + [DllImport("user32.dll")] + public static extern void SwitchToThisWindow(IntPtr hWnd); static void Main() { - //related .dll import - [DllImport("user32.dll")] - public static extern void SwitchToThisWindow(IntPtr hWnd); - - String ProcWindow = "main"; + // -------------------------------------------------------------------------------- + // --- + // -------------------------------------------------------------------------------- + String procName = "MATLAB"; //function which calls switchWindow() is here but not important - - Process[] procs = Process.GetProcessesByName(ProcWindow); - foreach (Process proc in procs) - { - //switch to process by name + // // + Process[] procs = Process.GetProcessesByName(procName); + int nProcs = procs.Length; + if (nProcs < 1) { + Console.WriteLine("No process found for name: {0}", procName); + }else{ + // We'll use the first window we found + Process proc=procs[0]; + if (nProcs >1) { + Console.WriteLine("{0} processes found with name: {0}",nProcs,procName); + Console.WriteLine("Using first process:"); + Console.WriteLine("Process Name: {0} ID: {1} Title: {2}", proc.ProcessName, proc.Id, proc.MainWindowTitle); + } + // --- Switching to window using user32.dll function SwitchToThisWindow(proc.MainWindowHandle); - Console.WriteLine("Process: {0} ID: {1} Window title: {2}", proc.ProcessName, proc.Id, proc.MainWindowTitle); - } + // --- Alternative method using AutomationElement +// AutomationElement element = AutomationElement.FromHandle(proc.MainWindowHandle); +// if (element != null) { element.SetFocus(); } + } // Proc Window found } } -} - - -// -------------------------------------------------------------------------------- -// --- -// -------------------------------------------------------------------------------- -http://stackoverflow.com/questions/2315561/correct-way-in-net-to-switch-the-focus-to-another-application -// -------------------------------------------------------------------------------- -// --- -// -------------------------------------------------------------------------------- -AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle); -if (element != null) -{ - element.SetFocus(); -} diff --git a/wmctrl.cs b/wmctrl.cs new file mode 100644 index 0000000..067c6b0 --- /dev/null +++ b/wmctrl.cs @@ -0,0 +1,123 @@ +using System; // For IntPtr +using System.Runtime.InteropServices; // DllImport +using System.Diagnostics; // Process + +public class wmctrl +{ + + // -------------------------------------------------------------------------------- + // --- Switch to Window + // -------------------------------------------------------------------------------- + //dll import (can't be in method, but needs to be in class + [DllImport("user32.dll")] + public static extern void SwitchToThisWindow(IntPtr hWnd); + + public static int SwitchToWindow(string procName){ + // Getting window matching + Process[] procs = Process.GetProcessesByName(procName); + int nProcs = procs.Length; + if (nProcs < 1) { + Console.WriteLine("Error: No process found for name: {0}", procName); + return -1 ; + }else{ + // We'll use the first window we found + Process proc=procs[0]; + if (nProcs >1) { + Console.WriteLine("{0} processes found with name: {1}",nProcs,procName); + Console.WriteLine("Using first process:"); + Console.WriteLine("Process Name: {0} ID: {1} Title: {2}", proc.ProcessName, proc.Id, proc.MainWindowTitle); + } + // --- Switching to window using user32.dll function + SwitchToThisWindow(proc.MainWindowHandle); + return 0; + } + } + + + // -------------------------------------------------------------------------------- + // --- List Windows info + // -------------------------------------------------------------------------------- + public static int ListWindows(){ + Process[] processlist = Process.GetProcesses(); + Console.WriteLine("ID: \t Name:\t Title:"); + Console.WriteLine("-------------------------------------------------"); + foreach (Process proc in processlist) + { + if (!String.IsNullOrEmpty(proc.MainWindowTitle)) + { + Console.WriteLine("{0}\t {1}\t {2}", proc.Id,proc.ProcessName, proc.MainWindowTitle); + } + } + return 0; + } + + // -------------------------------------------------------------------------------- + // --- Print command usage + // -------------------------------------------------------------------------------- + public static void print_usage(){ + Console.WriteLine(""); + Console.WriteLine("usage: wmctrl [options] [args]"); + Console.WriteLine(""); + Console.WriteLine("options:"); + Console.WriteLine(" -h : show this help"); + Console.WriteLine(" -l : list windows"); + Console.WriteLine(" -a : switch to the window of the process name "); + Console.WriteLine(""); + + } + + // -------------------------------------------------------------------------------- + // --- Main Program + // -------------------------------------------------------------------------------- + public static int Main(string[] args) + { + int status=0; // Return status for Main + + // -------------------------------------------------------------------------------- + // --- Parsing arguments + // -------------------------------------------------------------------------------- + int nArgs=args.Length; + if (nArgs==0){ + Console.WriteLine("Error: insufficient command line arguments"); + print_usage(); + return 0; + } + int i=0; + while (i