Манипулирование окном / процессом его дескриптором (даже если нет заголовка или окна)
Я хочу проверить этот код и посмотреть, сможете ли вы помочь мне реализовать его
если это так, есть ли способ запросить быстрее, получая только процесс, который начинается с "а", а процесс начинается с "б"
(это с помощью filter
параметр)
это может быть сделано с помощью другого метода с параметрами, требуемыми
EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero)
как я могу позвонить EnumDesktopWindows()
с другой, может быть, не только с использованием нативного метода - фильтрация, как уже упоминалось...
private const string USER32 = "user32.dll";
internal delegate bool EnumDelegate(IntPtr hWnd, int lParam);
[DllImport(WindowsFunctions.USER32, EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
[DllImport(WindowsFunctions.USER32)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport(WindowsFunctions.USER32)]
internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
[DllImport(WindowsFunctions.USER32)]
internal static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpfn, IntPtr lParam);
public class WindowData
{
public string Title { get; set; }
public long ProcessId { get; set; }
public long ThreadId { get; set; }
public IntPtr HWindow { get; set; }
}
var collection = new List<WindowData>();
EnumDelegate filter = delegate(IntPtr hWnd, int lParam)
{
StringBuilder strbTitle = new StringBuilder(255);
int nLength = WindowsFunctions.GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1);
string strTitle = strbTitle.ToString();
if (IsWindowVisible(hWnd) && !string.IsNullOrEmpty(strTitle))
{
int pid;
int threadId = WindowsFunctions.GetWindowThreadProcessId(hWnd, out pid);
collection.Add(new WindowData()
{
Title = strbTitle.ToString(),
ProcessId = pid,
ThreadId = threadId,
HWindow = hWnd
});
}
return true;
};
if (EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero))
{
return collection.ToArray();
}
return null;
}
1 ответ
Это то, что я придумал как временное решение
public static class MyProc
{
public static IntPtr WoWhWnd;
public static string WoWProcName;
public static string WowMainWinTitle;
public static int WowID;
public static IntPtr MyApphWnd;
public static string MyAppProcName;
public static string MyAppMainWinTitle;
public static int MyAppID;
}
public void bring(string handletoFront)
{
switch (handletoFront)
{
default:
SetForegroundWindow(MyProc.WoWhWnd);
break;
case "MyApp":
SetForegroundWindow(MyProc.MyApphWnd);
break;
}
}
#region <<=========== Enumerating Processes ============>>
void ShowP1(){
IEnumerable<Process> processes = from p in Process.GetProcesses() where p.ProcessName.StartsWith(TBXSearchWindowTerm.Text) || p.ProcessName.StartsWith("WindowsF") orderby p.ProcessName select p;
MyProc.MyApphWnd = processes.ElementAt(1).MainWindowHandle;
MyProc.MyAppMainWinTitle = processes.ElementAt(1).MainWindowTitle;
MyProc.MyAppID = processes.ElementAt(1).Id;
MyProc.WoWhWnd = processes.ElementAt(0).MainWindowHandle;
MyProc.WowMainWinTitle = processes.ElementAt(0).MainWindowTitle;
MyProc.WowID = processes.ElementAt(0).Id;
pause(350);
SetForegroundWindow(MyProc.WoWhWnd);
pause(850);
SetForegroundWindow(MyProc.MyApphWnd);
}
в одном из запросов я использовал значение текстового поля, чтобы оно могло быть одним постоянным поиском и динамическим необязательным, если вы видите что-то, что я сделал неправильно, или я могу сделать лучше, пожалуйста, оставьте комментарий. благодарю вас.