Analysis-Services/BismNormalizer/AlmToolkit/WindowTitle.cs

162 lines
4.8 KiB
C#
Raw Normal View History

2019-11-28 15:51:28 +08:00
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace AlmToolkit
{
public class WindowTitle
{
//static void Main(string[] args)
//{
// var p = Process.GetProcessById(3484);
// var h = p.MainWindowHandle;
// string s = GetWindowTextTimeout(h, 100 /*msec*/);
//}
#region PInvoke calls to get the window title of a minimize window
delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
IntPtr lParam);
[DllImport("User32.dll", SetLastError = true)]
public unsafe static extern int SendMessageTimeout(
IntPtr hWnd,
uint uMsg,
uint wParam,
StringBuilder lParam,
uint fuFlags,
uint uTimeout,
void* lpdwResult);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam,
StringBuilder lParam);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern long GetWindowText(IntPtr hwnd, StringBuilder lpString, long cch);
const int WM_GETTEXT = 0x000D;
const int WM_GETTEXTLENGTH = 0x000E;
#endregion
private static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
var handles = new List<IntPtr>();
foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
EnumThreadWindows(thread.Id,
(hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);
return handles;
}
public static string GetWindowTitle(int procId)
{
foreach (var handle in EnumerateProcessWindowHandles(procId))
{
StringBuilder message = new StringBuilder(1000);
if (IsWindowVisible(handle))
{
//SendMessage(handle, WM_GETTEXT, message.Capacity, message);
//if (message.Length > 0) return message.ToString();
return GetCaptionOfWindow(handle);
}
}
return "";
}
/* ====================================== */
public static string GetWindowTitleTimeout(int procId, uint timeout)
{
string title = "";
foreach (var handle in EnumerateProcessWindowHandles(procId))
{
try
{
// if there is an issue with the window handle we just
// ignore it and skip to the next one in the collection
title = GetWindowTextTimeout(handle, timeout);
}
catch
{
title = "";
}
if (title.Length > 0) return title;
}
return title;
}
private static unsafe string GetWindowTextTimeout(IntPtr hWnd, uint timeout)
{
int length;
if (SendMessageTimeout(hWnd, WM_GETTEXTLENGTH, 0, null, 2, timeout, &length) == 0)
{
return null;
}
if (length == 0)
{
return null;
}
StringBuilder sb = new StringBuilder(length + 1); // leave room for null-terminator
if (SendMessageTimeout(hWnd, WM_GETTEXT, (uint)sb.Capacity, sb, 2, timeout, null) == 0)
{
return null;
}
return sb.ToString();
}
private static string GetCaptionOfWindow(IntPtr hwnd)
{
string caption = "";
StringBuilder windowText = null;
try
{
int max_length = GetWindowTextLength(hwnd);
windowText = new StringBuilder("", max_length + 5);
GetWindowText(hwnd, windowText, max_length + 2);
if (!String.IsNullOrEmpty(windowText.ToString()) && !String.IsNullOrWhiteSpace(windowText.ToString()))
caption = windowText.ToString();
}
catch (Exception ex)
{
caption = ex.Message;
}
finally
{
windowText = null;
}
return caption;
}
}
}