已知进程句柄及进程主窗口句柄,如何将窗口置前?

宏尘 2012-08-13 12:59:51
如题
[DllImport("User32.dll ", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll ", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

Process p = new Process();
p.StartInfo=new ProcessStartInfo("测试.exe");
p.Start();

ShowWindow(f.MainWindowHandle, 1);
MainWindowHandle不为0,但窗体居然没显示出来?

后来小的用IntPtr handle = FindWindow(null,"测试");
发现handle与MainWindowHandle的值不一样?不是同一个东西?请问大侠这是怎么回事,我该怎么利用进程,把这个进程里的窗体show同来咯?


...全文
324 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
宏尘 2012-08-14
  • 打赏
  • 举报
回复
此问题自已已解决,从查询2.exe的load事件内把句柄传给打开这个进程的软件,谢谢各路大侠的回答,
宏尘 2012-08-13
  • 打赏
  • 举报
回复
顶一个,在线等咯,急!!!
宏尘 2012-08-13
  • 打赏
  • 举报
回复
晕,我忽略了关健的地方没有告诉大家,软件的主窗体我设了一个下面的属性:
主窗体的ShowInTaskBar = false
所以我的问题应该是在这个ShowInTaskBar = false的情况下,如何show出已知进程的主窗口。
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
ShowWindow
SetForegroundWindow
一起使用


宏尘 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

/// <summary>
/// 设置进程窗口置顶
/// </summary>
/// <param name="process"></param>
public static void SetProcessTopMost(Process process)
{
try
……
[/Quote]
3楼,我这个软件同时打开了多个之后(没最小化也没最大化更没隐藏任何一个窗口),可用了你的方法还是行不通咯。没一点反应。
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
不客你开几个程序,开多少窗口
主窗口句柄基本上都是唯一的


wy811007 2012-08-13
  • 打赏
  • 举报
回复
用API具体 自己查下吧2L和3L那个应该是对的吧
宏尘 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C# code

/// <summary>
///
/// </summary>
/// <param name="lpClassName"></param>
/// <param name="lpWindowName"></param>
/// <returns></returns>
[Dll……
[/Quote]
2楼,如果我只是开一个应用程序窗口的话,用你那个方法应该没问题。但是当我这个程序打开多个的时候,这时候这些窗口标题都是一样的。你的方法就行不通了的。所以我标题都是注明"已知进程句柄及进程主窗口句柄,如何将窗口置前",所以我觉得或多或少都要与进程有点联系。
zmhkobe 2012-08-13
  • 打赏
  • 举报
回复
/// <summary>
/// 设置进程窗口置顶
/// </summary>
/// <param name="process"></param>
public static void SetProcessTopMost(Process process)
{
try
{
IntPtr handle = process.MainWindowHandle;
if (handle != null && handle != IntPtr.Zero)
{
IntPtr HWND_TOPMOST = new IntPtr(-1); //窗体置顶
IntPtr HWND_NOTOPMOST = new IntPtr(-2); //取消窗体置顶
uint SWP_NOMOVE = 0x0002; //不调整窗体位置
uint SWP_NOSIZE = 0x0001; //不调整窗体大小

SetWindowPos(handle, HWND_TOPMOST, 1, 1, 1, 1, SWP_NOMOVE | SWP_NOSIZE);
}
}
catch (Exception ex)
{ }
}
isjoe 2012-08-13
  • 打赏
  • 举报
回复

/// <summary>
///
/// </summary>
/// <param name="lpClassName"></param>
/// <param name="lpWindowName"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


/// <summary>
///
/// </summary>
/// <param name="hwnd"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern IntPtr SetForegroundWindow(IntPtr hwnd);

写:
IntPtr Hander = FindWindow(null, "窗口标题");
if (Hander != IntPtr.Zero)
{
SetForegroundWindow(Hander);
}

bdmh 2012-08-13
  • 打赏
  • 举报
回复
API的 SetForegroundWindow

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧