EnumWindows的使用

本文介绍了一种通过枚举窗口来控制特定窗口显示状态的方法,包括如何隐藏和显示任务栏及菜单栏,并提供了实现全屏显示和调整窗口大小的具体步骤。

// 枚举窗口回调

public delegate int EnumWindowsProc(IntPtr hwnd, IntPtr lParam);

 

EnumWindowsProc callbackDelegate;

IntPtr callbackDelegatePointer;

StringBuilder windowName;

 

private void button9_Click(object sender, EventArgs e)

{

     callbackDelegate = new EnumWindowsProc(EnumWindowsCallbackProc);

     callbackDelegatePointer = Marshal.GetFunctionPointerForDelegate(callbackDelegate);

     // 需指定大小

     // 默认容量是 16, 默认的最大容量是 Int32.MaxValue

     windowName = new StringBuilder(80);

bool res = EnumWindows(callbackDelegatePointer, 0);

}

 

int index = 0;

public int EnumWindowsCallbackProc(IntPtr hwnd, IntPtr lParam)

{

++index;

// 获取窗体名称,并返回实际的字符串长度(不包含空终结符)

StringBuilder aa = new StringBuilder(1000);

GetClassName(hwnd,  aa, 256);

if (aa.ToString() == "menu_worker")

{

ShowWindow(hwnd, true);

}

return 1;

}

 

 

/*

*file:   ScreenControl.h

*desp:   full screen

*/

#ifndef _SCREENCONTROL_H_

#define _SCREENCONTROL_H_

#include "aygshell.h"

class ScreenControl

{

public:

/// <summary>

/// 全屏,参考:ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/apippc/html/ppc_aygshell_fsiq.htm

/// </summary>

/// <param name="hWnd">窗体句柄</param>

void FullScreen(HWND hWnd)

{  

   SHFullScreen(hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON );

}

/// <summary>

/// 扩张或者收缩窗体工作区

/// </summary>

/// <param name="hMainWnd">窗体句柄</param>

/// <param name="rtSubWnd">矩形区域</param>

/// <param name="bExpand">TRUE:扩张;FALSE:收缩</param>

void ExpandWindow(HWND hMainWnd, RECT rtSubWnd, bool bExpand=true)

{

   if (bExpand)

   {

    // 扩张窗体,扩展后的窗体所在区域覆盖了原来的主从窗体

    RECT rtMainWnd = {0};

    GetWindowRect(hMainWnd, &rtMainWnd);

    MoveWindow(hMainWnd,

     min(rtMainWnd.left, rtSubWnd.left),

     min(rtMainWnd.top, rtSubWnd.top),

     max(rtMainWnd.right, rtSubWnd.right),

     max(rtMainWnd.bottom, rtSubWnd.bottom),

     true);

   }

   else

   {

    // 收缩窗体

    MoveWindow(hMainWnd, rtSubWnd.left, rtSubWnd.top,

     rtSubWnd.right - rtSubWnd.left, rtSubWnd.bottom - rtSubWnd.top, true);

   }

}

/// <summary>

/// 隐藏或显示窗体

/// </summary>

/// <param name="lpText">窗体标题,ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/wceshellui5/html/wce50lrfFindWindow.htm</param>

/// <param name="bHide">TRUE:隐藏;FALSE:显现</param>

/// <returns>被隐藏窗体的工作区</returns>

RECT HideWindow(LPCTSTR lpText, bool bHide=true)

{    

   RECT rtSubWnd = {0};

   HWND hSubWnd = NULL;

   hSubWnd = FindWindow(lpText, NULL);

   if (NULL != hSubWnd)

   {

    GetWindowRect(hSubWnd, &rtSubWnd);

    if (bHide)

    {

     // Update window working area size

     //SystemParametersInfo(SPI_SETWORKAREA, 0, &m_rtNewDesktop, SPIF_UPDATEINIFILE);      

     ShowWindow(hSubWnd, SW_HIDE);

    }

    else

    {

     // Update window working area size

     //SystemParametersInfo(SPI_SETWORKAREA, 0, &m_rtOldDesktop, SPIF_UPDATEINIFILE);     

     ShowWindow(hSubWnd, SW_SHOWNORMAL);

    }

   }

   return rtSubWnd;

}

};

#endif

隐藏任务栏与菜单栏:

ScreenControl screenControl;     // 屏幕控制器

GetWindowRect(hWnd, &rtWnd);     // 获取当前窗体所在区域,留作恢复窗体时使用

screenControl.FullScreen(hWnd);

screenControl.ExpandWindow(hWnd, screenControl.HideWindow(TEXT("HHTaskBar"), TRUE));

screenControl.ExpandWindow(hWnd, screenControl.HideWindow(TEXT("MENU_WORKER"), TRUE));

恢复任务栏与菜单栏:

screenControl.HideWindow(TEXT("HHTaskBar"), FALSE);

screenControl.HideWindow(TEXT("MENU_WORKER"), FALSE);

screenControl.ExpandWindow(hWnd, gRect, false);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值