不同进程之间发送消息将指定界面置顶

实现思路

获取需要被置顶的窗体Handle,将其置顶

 int handle = FindWindow(null, "排号窗口");
  QueueHandle = (int)mystr.dwData;
  //通过句柄
  ShowWindowAsync((IntPtr)handle, 1);


//方式二:或使用如下方式:

//设置窗体状态为默认大小
this.WindowState = FormWindowState.Normal;
//不显示在任务栏
this.ShowInTaskbar = false;

 

//方式三

[DllImport("user32 ")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

SetParent(this.Handle, (IntPtr)handle);

 

方式四

this.TopMost = true;

 

注意:具体使用需根据实际场景决定(可能需要配合使用iiiii)...

 

具体实现如下:

 #region 获取消息
        /// <summary>
        /// windowapi 通过句柄显示或隐藏窗体函数
        /// </summary>
        /// <param name="hWnd">窗体句柄</param>
        /// <param name="cmdShow">显示类型(0:隐藏窗体,1:默认大小窗体,2:最小化窗体,3:最大化窗体)</param>
        /// <returns>返回成功或失败</returns>
        [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
        public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

/// <summary> /// 0x004A /// </summary> const int WM_COPYDATA = 0x004A; //[StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } protected override void DefWndProc(ref System.Windows.Forms.Message m) { try { switch (m.Msg) { // 接收自定义消息 USER,并显示其参数 case WM_COPYDATA: COPYDATASTRUCT mystr = new COPYDATASTRUCT(); Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype); int handle = FindWindow(null, "排号窗口"); QueueHandle = (int)mystr.dwData; //通过句柄,最大化窗体 ShowWindowAsync((IntPtr)handle, 1); ReceiveMessage = mystr.lpData; ExecuteQueueFlowEvent(); break; default: base.DefWndProc(ref m); break; } } catch { return; } } #endregion

参考:https://www.cnblogs.com/xielong/p/6705243.html?utm_source=itdadao&utm_medium=referral     ——内容很全面谢谢分享

 

转载于:https://www.cnblogs.com/YYkun/p/8630774.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 C++ 实现的示例代码,用于根据进程 ID 查找进程界面窗口句柄: ```cpp #include <Windows.h> #include <TlHelp32.h> #include <vector> // 根据进程 ID 查找进程界面窗口句柄 HWND FindProcessWindow(DWORD pid) { HWND result = NULL; // 打开进程 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); if (hProcess == NULL) return NULL; // 枚举顶级窗口 std::vector<HWND> windows; EnumWindows([](HWND hwnd, LPARAM lParam) -> BOOL { std::vector<HWND>* windows = reinterpret_cast<std::vector<HWND>*>(lParam); DWORD processId = 0; GetWindowThreadProcessId(hwnd, &processId); if (processId == GetCurrentProcessId() || processId == 0) return TRUE; windows->push_back(hwnd); return TRUE; }, reinterpret_cast<LPARAM>(&windows)); // 遍历窗口,查找属于目标进程的可见窗口 for (auto hwnd : windows) { DWORD processId = 0; GetWindowThreadProcessId(hwnd, &processId); if (processId == pid && IsWindowVisible(hwnd)) { result = hwnd; break; } } CloseHandle(hProcess); return result; } int main() { // 查找进程界面窗口句柄 DWORD pid = 1234; // 请替换成目标进程进程 ID HWND hwnd = FindProcessWindow(pid); if (hwnd != NULL) { // 将窗口设置为当前活动窗口 SetForegroundWindow(hwnd); } return 0; } ``` 该示例代码首先通过函数`OpenProcess`打开进程句柄,然后使用函数`EnumWindows`枚举系统中所有的顶级窗口。对于每个窗口,使用函数`GetWindowThreadProcessId`获取窗口所属的进程 ID,如果窗口所属的进程 ID 与目标进程的 ID 相同,则说明该窗口属于目标进程。然后使用函数`IsWindowVisible`判断窗口是否可见,如果可见则说明该窗口是目标进程界面窗口。 最后,如果找到了目标进程界面窗口,则可以使用函数`SetForegroundWindow`将该窗口设置为当前活动窗口。注意,该函数只能将前台窗口设置为活动窗口,如果目标窗口被其他窗口遮挡,则需要使用其他方法将其置顶
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值