none
求助:如何用 FindWindow 函数来获得一个会自动关闭的窗体的 HWND RRS feed

  • 问题

  • 通常使用 Spy++ 可以得到 FindWindow 的两个参数 lpClassName 与 lpWindowName。

    但现在我需要获得一个 Win32 程序的 HWND。 这个 Win32 程序执行非常非常的快。基本上它黑色的控制台界面就是一闪而过,我根本抓不住。

    请问是否有其他办法可以拿到这两个参数?

    附: 我的根本意图是隐藏这个黑色的控制台的,因为那个Win32程序必须嵌套在我的程序中,而且这个Win32程序必须被执行,结果就弹出这样一个黑色的控制台,让用户的体验非常差。

    如果有哪位高人知道如何不通过 FindWindow 就可以隐藏这个 Win32 的控制台,恳请告知。正在承受客户的重压中....

    2009年8月5日 1:39

答案

  • 你好!
         可以参考这个方法,希望对你有帮助:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace HideConsole
    {
        class Program
        {
            [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
            static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
            [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            static void Main(string[] args)
            {
                Console.Title = "我被隐藏"; //为控制台窗体指定一个标题,便于定位和区分
                IntPtr a = FindWindow("ConsoleWindowClass", "我被隐藏");
                if (a != IntPtr.Zero)
                    ShowWindow(a, 0); //隐藏这个窗口
    
                Console.ReadKey(); //这句代码,保证程序不会退出,为了做演示而已
            }
        }
    }

    周雪峰
    • 已标记为答案 IGabriel 2009年8月7日 7:20
    2009年8月5日 4:16
    版主
  • class Program
    {
        static void Main(string[] args)
        {
            Execute();
            Console.ReadKey();
        }
    
        public static void Execute()
        {
            // test.exe 是我编写的一个控制台程序
            ProcessStartInfo info = new ProcessStartInfo("C:\\Test.exe");
            info.WindowStyle = ProcessWindowStyle.Hidden; // 隐藏窗口
            Process.Start(info);
        }
    }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 IGabriel 2009年8月7日 7:19
    2009年8月6日 5:28
    版主

全部回复

  • 你好!
         可以参考这个方法,希望对你有帮助:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace HideConsole
    {
        class Program
        {
            [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
            static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
            [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            static void Main(string[] args)
            {
                Console.Title = "我被隐藏"; //为控制台窗体指定一个标题,便于定位和区分
                IntPtr a = FindWindow("ConsoleWindowClass", "我被隐藏");
                if (a != IntPtr.Zero)
                    ShowWindow(a, 0); //隐藏这个窗口
    
                Console.ReadKey(); //这句代码,保证程序不会退出,为了做演示而已
            }
        }
    }

    周雪峰
    • 已标记为答案 IGabriel 2009年8月7日 7:20
    2009年8月5日 4:16
    版主
  • 多谢周雪峰版主的回复

    我也打算这样做的,但是我没有办法找到以下这一句所需的参数

    IntPtr a = FindWindow("ConsoleWindowClass", "我被隐藏");

    因为那个 Win32 窗口时一闪即逝的,无法采用 Spy++ 查看它的内容。不知道是否有解决办法?

    而且我也没有那个 Win32 程序的源代码,这个 .exe 是唯一接口了。

    • 已建议为答案 Tommy_CD 2009年8月7日 16:00
    2009年8月6日 1:11
  • 只有一个exe吗?那很难控制他隐藏,总是需要闪一下的!
    周雪峰
    2009年8月6日 3:44
    版主
  • 是的, 就只有那个 .exe 了。

    而且必须使用它。这么闪一下,客户就不满意了,烦恼啊。
    2009年8月6日 4:22
  • class Program
    {
        static void Main(string[] args)
        {
            Execute();
            Console.ReadKey();
        }
    
        public static void Execute()
        {
            // test.exe 是我编写的一个控制台程序
            ProcessStartInfo info = new ProcessStartInfo("C:\\Test.exe");
            info.WindowStyle = ProcessWindowStyle.Hidden; // 隐藏窗口
            Process.Start(info);
        }
    }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 IGabriel 2009年8月7日 7:19
    2009年8月6日 5:28
    版主
  • class Program
    
    {
    
        static void Main(string[] args)
    
        {
    
            Execute();
    
            Console.ReadKey();
    
        }
    
    
    
        public static void Execute()
    
        {
    
            // test.exe 是我编写的一个控制台程序
    
            ProcessStartInfo info = new ProcessStartInfo("C:\\Test.exe");
    
            info.WindowStyle = ProcessWindowStyle.Hidden; // 隐藏窗口
    
            Process.Start(info);
    
        }
    
    }
    
    

    知识改变命运,奋斗成就人生!

    谢谢! 完美地解决了此问题。
    2009年8月7日 7:19
  • 的确很完美,XXY的解决方法很好啊!

    周雪峰
    2009年8月7日 10:30
    版主