已知一个第三方程序的进程句柄hProcess,怎么能把这个进程对应的程序给显示出来
就像如果已经打开了一个msn,当再次执行msn时,之前的msn窗口会自动显示出来那样的效果。
实在不行的话,让那个程序在任务栏上闪动也行。
原因是这样的:
我的程序界面里有个按钮,用户点击的时候会把一个程序给运行起来,那个程序本身是允许运行多个的。
可是我要在我的程序里控制只能运行一个。
如果发现程序已经运行,就把之前运行的程序给显示出来。
否则用户没注意程序已经运行,会不停的点那个按钮。现在我已经可以判断出来那个程序是否已经运行,也能够得到进程句柄。就是不知道怎么把对应的程序给显示出来。

解决方案 »

  1.   

    枚举其中的窗口,过滤出顶层窗口,特别是主线程的顶层窗口。如果只是拉到前端就再加一过滤条件Visibled
      

  2.   

    RegisterWindowMessage
    注册一个自定义消息然后
    BroadcastSystemMessage
    直接广播你的自定义消息好了,连进程句柄都不需要知道
      

  3.   

    用EnumWindows找到程序的主窗口句柄再显示。
    如果是自己写的程序,要防止多次运行,建个互斥对象就可以了
      

  4.   

    已知进程句柄就可以想办法得到窗口句柄,为什么"不要通过窗口标题或者窗口句柄来进行处理"呢?
    哪怕用GetWindowThreadProcessId配合EnumWindows也可以啊不要总先入为主的给命题加这样那样的限制,非要认准了所有操作只能围绕进程句柄来.变通的方法很多的.
      

  5.   

    如果你是操作一个第三方程序那还好说,关键程序都是你自己写的,变态点的话,你程序一运行就在目录下创建个txt文件,把主窗体handle写进去. 之后运行先检查有没有这个文件,有就把那个hanlde显示置顶不是说要用这种方法,而是说变通的方法太多了. 不要因为客观条件限制不能用finwindows,就认定一定不能通过窗体句柄而必须通过进程句柄来操作.
      

  6.   

    to skylkj:
    那个第三方程序不是我写的,要不就不说是“第三方”了,所以你说的方法基本都不行。我不能findwindow,也就是说不能直接去找窗口句柄,是有我的原因的。
    除非是通过进程句柄获取窗口句柄到的才可以。
    但即使根据进程句柄去获取窗口句柄也有个问题,就是如果那个程序有多个窗口,就比较麻烦。
    其实我想实现的效果就是:
    如果那个程序在任务栏上不是当前的,就让它是当前的,就好像用鼠标在任务栏上点那个程序一下一样。
    或者说
    在任务管理器中应用程序列表中选中一个程序,然后点“切换至”这样的效果。to gyk120:
    你说的办法我当然想到了,但不友好啊。如果要让那个程序显示出来,就必须想办法知道窗口句柄吗?唯一途径?to 僵哥:
    枚举这个办法我也想过了,有点麻烦。所以想跑来这里问,看是不是有更好的办法。
      

  7.   

    不好意思,我看错了,以为是你自己的程序要阻止重复运行.昨晚看球,现在头还晕着用GetWindowThreadProcessId配合EnumWindows枚举应该是可以的僵哥说的方法应该可行
      

  8.   

    任务栏闪动用FlashWindow
    例如:FlashWindow(Application.Handle, True);
      

  9.   

    那知道进程句柄,有办法知道Application.Handle吗?
      

  10.   

    var
    hWin:thandle;
    begin hwin:=strtoint(edit1.Text) ;
    ShowWindow(hwin,SW_SHOW);
    SendMessage(hwin, WM_SYSCOMMAND, SC_RESTORE, 0);
    setforegroundwindow(hwin);