• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

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

宏尘 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同来咯?


...全文
230 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
宏尘 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)
{ }
}
回复
拿AK47的天使 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
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2012-08-13 12:59
社区公告

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