C# 能否通过SetForegroundWindow API函数设置多个窗体同时前置
时间: 2023-12-29 14:03:01 浏览: 80
C#多窗体操作
使用 SetForegroundWindow API 函数一次设置多个窗口为前台窗口是不支持的。因为操作系统只能将一个窗口设置为前台窗口,而且这个窗口必须属于当前活动的进程。如果您想同时将多个窗口设置为前台窗口,您需要模拟用户的键盘和鼠标操作,依次将每个窗口激活到前台。下面是一个示例代码:
```csharp
using System.Runtime.InteropServices;
using System.Threading;
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int VK_MENU = 0x12;
const int VK_TAB = 0x09;
const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
const uint MOUSEEVENTF_LEFTUP = 0x0004;
static void SetForegroundWindows(List<IntPtr> handles)
{
foreach (IntPtr handle in handles)
{
// 模拟 Alt+Tab 切换窗口
keybd_event(VK_MENU, 0, 0, UIntPtr.Zero);
keybd_event(VK_TAB, 0, 0, UIntPtr.Zero);
Thread.Sleep(100);
keybd_event(VK_TAB, 0, 0x0002, UIntPtr.Zero);
keybd_event(VK_MENU, 0, 0x0002, UIntPtr.Zero);
// 模拟鼠标点击激活窗口
SetForegroundWindow(handle);
SendMessage(handle, WM_KEYDOWN, VK_TAB, 0);
SendMessage(handle, WM_KEYUP, VK_TAB, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, UIntPtr.Zero);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, UIntPtr.Zero);
}
}
```
在这个示例代码中,SetForegroundWindow 函数用于将窗口设置为前台窗口,keybd_event 函数和 mouse_event 函数用于模拟键盘和鼠标操作。SetForegroundWindows 函数用于设置多个窗口为前台窗口,其参数为窗口句柄列表。这里模拟了 Alt+Tab 切换窗口和鼠标点击激活窗口的操作,通过循环依次将每个窗口激活到前台。
阅读全文