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

被折叠的 条评论
为什么被折叠?



