隐藏窗口任务条形码不适用于iis7.5

时间:2015-01-20 08:58:45

标签: c# asp.net .net

我正在处理窗口的隐藏任务栏此代码在visual studo 2010上工作正常但不能在IIS 7.5上运行而且没有给出任何错误。请告诉我为什么这段代码不适用于iis7.5(窗口7)

这是我的代码

public static class Taskbar
{
    [DllImport("user32.dll")]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); 
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam);
    [DllImport("user32.dll", SetLastError = true)]
    private static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className,  string windowTitle);
    [DllImport("user32.dll")]
    private static extern IntPtr FindWindowEx(IntPtr parentHwnd, IntPtr childAfterHwnd, IntPtr className, string windowText);
    [DllImport("user32.dll")]
    private static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
    [DllImport("user32.dll")]
    private static extern uint GetWindowThreadProcessId(IntPtr hwnd, out int lpdwProcessId);

    private const int SW_HIDE = 0;
    private const int SW_SHOW = 5;

    private const string VistaStartMenuCaption = "Start";
    private static IntPtr vistaStartMenuWnd = IntPtr.Zero;
    private delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam);

    /// <summary>
    /// Show the taskbar.
    /// </summary>
    public static void Show()
    {
        SetVisibility(true);
    }

    /// <summary>
    /// Hide the taskbar.
    /// </summary>
    public static void Hide()
    {
        SetVisibility(false);
    }

    /// <summary>
    /// Sets the visibility of the taskbar.
    /// </summary>
    public static bool Visible
    {
        set { SetVisibility(value); }
    }

    /// <summary>
    /// Hide or show the Windows taskbar and startmenu.
    /// </summary>
    /// <param name="show">true to show, false to hide</param>
    private static void SetVisibility(bool show)
    {
        // get taskbar window
        IntPtr taskBarWnd = FindWindow("Shell_TrayWnd", null);

        // try it the WinXP way first...
        IntPtr startWnd = FindWindowEx(taskBarWnd, IntPtr.Zero, "Button", "Start");

        if (startWnd == IntPtr.Zero)
        {
            // try an alternate way, as mentioned on CodeProject by Earl Waylon Flinn
            startWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, "Start");
        }

        if (startWnd == IntPtr.Zero)
        {
            // ok, let's try the Vista easy way...
            startWnd = FindWindow("Button", null);

            if (startWnd == IntPtr.Zero)
            {
                // no chance, we need to to it the hard way...
                startWnd = GetVistaStartMenuWnd(taskBarWnd);
            }
        }

        ShowWindow(taskBarWnd, show ? SW_SHOW : SW_HIDE);
        ShowWindow(startWnd, show ? SW_SHOW : SW_HIDE);
    }

    /// <summary>
    /// Returns the window handle of the Vista start menu orb.
    /// </summary>
    /// <param name="taskBarWnd">windo handle of taskbar</param>
    /// <returns>window handle of start menu</returns>
    private static IntPtr GetVistaStartMenuWnd(IntPtr taskBarWnd)
    {
        // get process that owns the taskbar window
        int procId;
        GetWindowThreadProcessId(taskBarWnd, out procId);

        Process p = Process.GetProcessById(procId);
        if (p != null)
        {
            // enumerate all threads of that process...
            foreach (ProcessThread t in p.Threads)
            {
                EnumThreadWindows(t.Id, MyEnumThreadWindowsProc, IntPtr.Zero);
            }
        }
        return vistaStartMenuWnd;
    }

    /// <summary>
    /// Callback method that is called from 'EnumThreadWindows' in 'GetVistaStartMenuWnd'.
    /// </summary>
    /// <param name="hWnd">window handle</param>
    /// <param name="lParam">parameter</param>
    /// <returns>true to continue enumeration, false to stop it</returns>
    private static bool MyEnumThreadWindowsProc(IntPtr hWnd, IntPtr lParam)
    {
        StringBuilder buffer = new StringBuilder(256);
        if (GetWindowText(hWnd, buffer, buffer.Capacity) > 0)
        {
            Console.WriteLine(buffer);
            if (buffer.ToString() == VistaStartMenuCaption)
            {
                vistaStartMenuWnd = hWnd;
                return false;
            }
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:0)

它不起作用,因为IIS作为Windows服务运行,因此禁止与桌面交互。

您是否预计会在客户端发生这种情况?如果您的代码确实有效,那么它将发生在服务器上,而不是客户端上。但它没有,所以放弃。