调用第三方软件A,最小化时,只有在任务栏的有个图标.想让他显示到桌面的最顶层,激活。
显示调用ShowWindow(hWnd1, 1),A窗体可以显示了,但是A窗体里面除了菜单栏可以使用外,其他的功能,按钮,全都不能正常显示,感觉像是假死一样。
在任务栏的小图标还可以使用,要退出在重新登录A窗体才正常,
我用了UpdateWindow(hWnd1);InvalidateRect(hWnd1, (IntPtr )0, true);都不起作用。
网上也有要重新创建一个,可太复杂了,还需要类名和名称还有一些参数坐标等等.
 [DllImport("user32.dll", EntryPoint = "ShowWindow")]
public extern static int  ShowWindow(IntPtr hDlg, short State);

解决方案 »

  1.   

    在加分
    没有死循环 ,就是一个ShowWindow函数,我先把窗体最小化了,只有在任务栏显示,然后用ShowWindow,把他给显示出来
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", EntryPoint = "ShowWindow")]
    public extern static int ShowWindow(IntPtr hDlg, short State);//方法
     IntPtr hWnd1 = (IntPtr)0;
    hWnd1 =FindWindow("tSkMainForm.UnicodeClass", null);//取得主窗体的句柄
    int intaa =ShowWindow(hWnd1, 1);
      

  2.   

    你应该用 SetActiveWindow[DllImport("user32.dll", SetLastError=true)]
    public static extern IntPtr SetActiveWindow(IntPtr hWnd);
      

  3.   


    没有任何的反应,是不是我哪错误了呢
    IntPtr hWnd1 = (IntPtr)0;
    hWnd1 = FindWindow("tSkMainForm.UnicodeClass", null);
    SetActiveWindow(hWnd1);
      

  4.   

    hWnd1 查查不是0吧。[align=center]**********************************************
    欢迎使用 CSDN 小秘书
    http://blog.csdn.net/whowhen21
    **********************************************[/align]
      

  5.   

    不是0,可以正常取到的,是正确的,因为我在别的功能有使用它,在做别的功能操作了。我用ShowWindow,是可以显示窗体的,但是会假死状态
      

  6.   

    我觉得原因可能是这样的,showwindow只是激活窗体,里面的控件实际也是createwindow出来的,如果可见性在创建时设置过,可能不能在对窗体showwindow时显示出来。
    如果是这样,在ShowWindow(hWnd1, 1)之后再加一次ShowWindow(hWnd1, 5)试一下,或者枚举其所有控件都show一次。
      

  7.   


    public class WindowChange
        {
           [DllImport("user32.dll")]
           private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
           private const int SW_HIDE=0;      //常量,隐藏
            private const int SW_SHOWNORMAL = 1;      //常量,显示,标准状态
            private const int SW_SHOWMINIMIZED = 2;     //常量,显示,最小化
            private const int SW_SHOWMAXIMIZED = 3;    //常量,显示,最大化
            private const int SW_SHOWNOACTIVATE = 4;      //常量,显示,不激活
            private const int SW_RESTORE = 9;      //常量,显示,回复原状
            private const int SW_SHOWDEFAULT = 10;     //常量,显示,默认
            public static void ToChange(IntPtr p, bool isboolean)
            {
                if (isboolean)
                {
                    ShowWindowAsync(p, SW_SHOWNORMAL);
                }
                else
                {
                    ShowWindowAsync(p, SW_HIDE);
                }
            }   
        }
      

  8.   


    ShowWindowAsync 还是ShowWindow一样,出现假死,
    菜单栏,还是可以显示,但是里面的窗体,假死状态,看不见里面的所有的按钮功能。
      

  9.   


    尝试过Show其他软件的窗体吗?
    我自己测试无问题。
      

  10.   

    我有调用过其他的窗体,都可以的,直接用ShowWindow(hWnd1, 1);都可以显示正常,
    唯独现在这个第三方软件的窗体比较复杂,里面的窗体控件多了一些。调用显示时,除了菜单控件可以以为,别的都没显示正常。
      

  11.   

    ShowWindowAsync都搞不定,实在想不到更好的办法了~~~~~~~~~~~~
      

  12.   

    Declare Function ShowWindowAsync Lib "user32" Alias "ShowWindowAsync" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 
    说明 
    与ShowWindow相似,只是这时的ShowWindow命令会投递到指定的窗口,然后进行异步处理。这样一来,就可控制从属于另一个进程的窗口的可视情况。同时无须担心另一个进程挂起的时候,自己的应用程序也会牵连其中 
      

  13.   

    我也用了ShowWindowAsync 发现窗体是可以出来,但是里面的控件小窗体什么的,全部都假死的,
    1.有朋友说用下面的方法,可我感觉不是很对,因为他是在打开的窗体执行事件
     protected override void WndProc(ref Message m )
           {
                switch (m.Msg)拦截这个消息
                { 
                    case MSG//msg 替换成最小化消息:
                        此处添加是窗体置顶的实现函数 WINapi有 自己可以查下
                        break;            
                }
                base.WndProc(ref m);//系统创建
            }
    2.看来只能用取系统托盘的图标句柄,然后双击了