当前位置: 首页 > news >正文

网站建设平台还有没有趋势seo整站优化费用

网站建设平台还有没有趋势,seo整站优化费用,wordpress 前台登陆插件,photoshop平面设计教学视频目录 1、检测窗口状态 2、将窗口前置显示 2.1、将窗口拉到最前面显示 2.2、将窗口置顶显示 2.3、将窗口设置到指定窗口的上面 3、将不显示的窗口强行显示出来 4、获取窗口的信息 5、通过窗口信息去查找窗口 5.1、调用GetClassName接口去比对窗口的类名 5.2、调用Find…

目录

1、检测窗口状态

2、将窗口前置显示

2.1、将窗口拉到最前面显示

2.2、将窗口置顶显示

2.3、将窗口设置到指定窗口的上面

3、将不显示的窗口强行显示出来

4、获取窗口的信息

5、通过窗口信息去查找窗口

5.1、调用GetClassName接口去比对窗口的类名

5.2、调用FindWindow去查找指定窗口类名和标题的窗口

5.3、通过给窗口设置属性值去标记窗口或者传递标记信息

6、调用SetWindowLong给目标窗口设置新的窗口处理函数,在新窗口处理函数中拦截消息


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N176https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N176https://blog.csdn.net/chenlycly/article/details/125529931       在GUI用户界面用户程序中,需要调用系统API函数去操作并控制窗口对象,下面对常用的API函数及窗口处理经验做一个总结,以供参考。

1、检测窗口状态

       比如判断是否是有效的窗口、窗口是否处于显示状态、窗口是否最小化或最大化等,用到的API接口都是比较常用的。

       判断是否是个有效的窗口,调用IsWindow(传入指向窗口的窗口句柄),主要用来检测窗口句柄指向的窗口是否已经被关闭(销毁)。有时我们在操作窗口或者给窗口发送消息之前,会去检测窗口句柄是否有效。

       判断目标窗口是否处于掩藏状态(非显示状态),调用IsWindowVisible接口。判断窗口是否最小化,调用IsIconic。判断窗口是否最大化,调用IsZoomed。

2、将窗口前置显示

       有时我们需要将窗口拉到最前面显示或者置顶显示,或者是指定窗口的Z序让某个窗口显示另一个窗口上面。

2.1、将窗口拉到最前面显示

        有时我们在创建好窗口后,需要将窗口拉到最前端显示,比如:

// 窗口已经创建
ShowWindow( hWnd, SW_SHOW );
SetForegroundWindow( hWnd );

       有时我们点击界面中的某个按钮去将某个窗口显示出来,这个窗口之前已经创建并打开,只是被其他窗口遮住了,这时我们只需要将目标窗口拉到最前面显示,就可以调用SetForegroundWindow。

2.2、将窗口置顶显示

       有时我们需要将目标窗口置顶显示,即将目标窗口显示在所有窗口最上面,始终显示在最上面不被其他窗口遮盖,则需要调用SetWindowPos接口,传入HWND_TOPMOST参数,如下所示:

::SetWindowPos(hTargetWnd, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOSIZE | SWP_NOMOVE);

最后的参数标记,SWP_NOSIZE表示执行SetWindowPos时不改变窗口的大小,SWP_NOMOVE表示执行SetWindowPos时不改变窗口的位置。

       也可以将置顶窗口取消置顶,传入HWND_NOTOPMOST参数即可,如下:

::SetWindowPos(hTargetWnd, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOSIZE | SWP_NOMOVE);

2.3、将窗口设置到指定窗口的上面

        这是将目标窗口的Z序固定到指定窗口的上面,可以调用SetWindowPos来实现:

::SetWindowPos(hTargetWnd, hWndInsertAfter, NULL, NULL, NULL, NULL, SWP_NOSIZE | SWP_NOMOVE);

将窗口句柄hTargetWnd指向的窗口的Z序设置到hWndInsertAfter指向的窗口上面。比如两个Z序同层次兄弟窗口,有着相同的父窗口,如果希望将一个固定显示在另一个窗口上面,就可以使用这个方法。

3、将不显示的窗口强行显示出来

       之前在开发新版本的软件时,正常情况下,程序启动后会把程序的主窗口显示出来,但在个别Win10的电脑上会时不时地出现程序启动后主窗口显示不出来的问题。这个问题在某几个电脑上不是必现的,但复现的概率很大。

       查看相关代码发现,主窗口已经创建并已经将主窗口给Show出来了,但在个别电脑上有时就是显示不出来,添加了调用SetForegroundWindow的代码,还是有问题。用VS自带的SPY++工具查看到窗口已经处于显示状态:

窗口风格中有WS_VISIBLE,表示窗口已处于显示状态。于是在SPY++抓取的窗口属性中查看窗口的坐标:

窗口坐标也是正常的,在Windows桌面可见范围内的!
       后来尝试采用规避的方法试试,强行将窗口拉出来显示。先尝试将窗口向左上角移动几个像素,再移动到原来的位置,代码如下:

HWND hTargetWnd;
RECT rcWnd;
::GetWindowRect(hTargetWnd, &rcWnd);// 1、先将窗口向左上角移动2个像素
RECT rcTmp = rcWnd;
rcTmp.left -= 2;
rcTmp.top -= 2;
rcTmp.right -= 2;
rcTmp.bottom -= 2;
MoveWindow(hTargetWnd, &rcTmp);// 2、再将窗口移动回原来的位置
MoveWindow(hTargetWnd, &rcWnd);

       经测试验证,这个方法确实是有效的,但有个小问题,因为来回移动窗口,窗口可能有个小抖动的感觉。于是又去尝试其他的方法,先将窗口置顶,然后再取消置顶,代码如下:

::SetWindowPos(hTargetWnd, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOSIZE | SWP_NOMOVE);
::SetWindowPos(hTargetWnd, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOSIZE | SWP_NOMOVE);

经测试,这个方法也是有效的,后来就采用了这个方法。

在实在排查不出具体的原因时,可以尝试去采用一些规避的办法去解决。

4、获取窗口的信息

       有时我们需要在程序中去识别一些窗口,看看窗口是否是目标窗口,通过获取一些窗口信息去鉴别。调用GetWindowText去获取窗口标题:

TCHAR szWndText[255] = {0};
GetWindowText(hTargetWnd, szWndText, sizeof(szWndText) / sizeof(TCHAR) - 1);
// 调用GetClassName去获取窗口类名:
TCHAR szWndClassName[255] = { 0 };
GetClassName(hTargetWnd, szWndClassName, sizeof(szWndClassName)/sizeof(TCHAR) - 1);

5、通过窗口信息去查找窗口

        可以通过窗口的一些属性信息去查找目标窗口,找到后对目标窗口进行操作。

5.1、调用GetClassName接口去比对窗口的类名

       注意,本文讲的窗口类名是注册窗口时指定的窗口类名,如下:

bool CXXXXXXWnd::RegisterWindowClass()
{WNDCLASS wc = { 0 };wc.style = GetClassStyle();wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hIcon = NULL;wc.lpfnWndProc = CWindowWnd::__WndProc;wc.hInstance = CPaintManagerUI::GetInstance();wc.hCursor = ::LoadCursor( NULL, IDC_ARROW );wc.hbrBackground = NULL;wc.lpszMenuName  = NULL;wc.lpszClassName = _T("CTestDlg"); // 注册窗口时指定的窗口类名ATOM ret = ::RegisterClass(&wc);ASSERT( ret != NULL || ::GetLastError() == ERROR_CLASS_ALREADY_EXISTS );return ret != NULL || ::GetLastError() == ERROR_CLASS_ALREADY_EXISTS;
}

并不是窗口对应的C++类的名称。

       比如如下的代码,将本进程中的窗口类名为CMenuWnd或CDiagnoseDlg的窗口自动关闭掉:

HWND hFocusWnd = ::GetFocus();
TCHAR szClassName[MAX_PATH] = { 0 };
::GetClassName(hFocusWnd, szClassName, sizeof(szClassName) / sizeof(TCHAR));
if (!_tcsicmp(szClassName, _T("CMenuWnd")) || !_tcsicmp(szClassName, _T("CDiagnoseDlg")))
{DWORD dwWndProcessId = 0;::GetWindowThreadProcessId(hFocusWnd, &dwWndProcessId);DWORD dwCurProcessId = ::GetCurrentProcessId();if (dwWndProcessId == dwCurProcessId) // 是本进程的窗口{// 直接将组合框的弹出的下拉窗口关闭掉::SendMessage(hFocusWnd, WM_CLOSE, 0, 0);}
}

代码中只处理本进程的相关窗口,所以调用GetWindowThreadProcessId获取窗口的进程id,和调用GetCurrentProcessId函数返回的当前进程id相比较。

        当然上述代码是非常规的做法,只用在特殊的场景下,这个地方只是给出一个示例。

5.2、调用FindWindow去查找指定窗口类名和标题的窗口

        FindWindow API函数的声明如下:

HWND WINAPI FindWindowW(__in_opt LPCTSTR lpClassName,
__in_opt LPCTSTR lpWindowName);

前一个参数是窗口类名,后一个参数是窗口名称,可以只通过其中一个搜索:(不用的参数置为NULL)

HWND hwnd = ::FindWindow( _T("窗口类名"), NULL);
// 也可以两个参数条件一起搜索:
HWND hwnd = ::FindWindow( _T("窗口类名"), _T("窗口名称");
if ( hwnd )
{::SendMessage( hwnd, WM_CLOSE, 0, 0 );
}

5.3、通过给窗口设置属性值去标记窗口或者传递标记信息

        可以调用SetProp API函数给目标窗口设置属性及属性值:

::SetProp(hTargetWnd, _T("Target_Paint_Wnd_Property"), (HANDLE)1);

给目标窗口添加Target_Paint_Wnd_Property属性,并将属性值设置为1。这样,在搜索窗口时,可以去读窗口的Target_Paint_Wnd_Property属性的属性值:

HANDLE handle = ::GetProp(hTargetWnd, _T("Target_Paint_Wnd_Property"));

如果为1,则表示该窗口就是我们要找的目标窗口。

6、调用SetWindowLong给目标窗口设置新的窗口处理函数,在新窗口处理函数中拦截消息

       先调用API函数GetWindowLong,传入GWL_WNDPROC参数,获取目标窗口当前的窗口处理函数,并保存下来。然后再调用API函数SetWindowLong,传入GWL_WNDPROC参数,给目标窗口设置新的窗口处理函数,在新的窗口处理函数中拦截消息,示例代码如下:

HWND g_hRecvMsgWnd = NULL;
WNDPROC g_oldWndProc = NULL;// 用于拦截消息的新的窗口处理过程
LRESULT CALLBACK NewWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{// 在此处使用消息号来拦截消息//if ( uMsg == WM_XXXXXXX)//{//}// 不拦截的消息还是交给老的窗口处理过程去处理if (g_oldWndProc != NULL){return CallWindowProc(g_oldWndProc, hWnd, uMsg, wParam, lParam);}return 0;
}void MainProcFunc()
{// 创建消息接收窗口g_hRecvMsgWnd = ::CreateWindowEx(0, _T("Static"), _T("RecvMsgWnd"), WS_DISABLED, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, 0, 0);if (g_hRecvMsgWnd != NULL){// 先保存老的窗口处理函数,然后设置新的窗口处理函数NewWndProc,这样就可以// 在NewWndProc中拦截消息了g_oldWndProc = reinterpret_cast<WNDPROC>(GetWindowLong(g_hRecvMsgWnd, GWL_WNDPROC));SetWindowLong(g_hRecvMsgWnd, GWL_WNDPROC, reinterpret_cast<s32>(NewWndProc));}else{g_oldWndProc = NULL;}
}
http://www.15wanjia.com/news/6546.html

相关文章:

  • 没有网站百度推广高级seo培训
  • 佛山大沥上海百度seo优化
  • dw做网站视频教程职业培训网络平台
  • 如何建立一个个人网站优化方案丛书官网
  • 怎么把网站做seo到首页企业培训课程ppt
  • 网站关键词整体方案泰安短视频seo
  • 三维在线设计网站找合作项目app平台
  • markdown做网站上海网络推广软件
  • 锦州北京网站建设seo网络推广哪家专业
  • wordpress技术站主题郑州seo外包收费标准
  • liunx做网站跳转服务器深圳企业seo
  • 前端公众号开发北京seo优化哪家公司好
  • 自己做照片书的网站站长统计幸福宝下载
  • 苏州 做网站网络营销的主要方法
  • 钓鱼网站制作方法北京网站优化校学费
  • 住房与城乡建设管理委员会网站淘宝店铺推广
  • 上线公司 企业网站怎么搭建属于自己的网站
  • wordpress美女主题网站关键词优化公司
  • 重庆网站设计工作室北京外包seo公司
  • 茂名公司网站设计团队新能源汽车公司
  • 济南网站建设策划故事性营销软文
  • 福州企业网站建设站长源码
  • 网站建设开发进度表西安今日头条新闻消息
  • 仿美空网 wordpress邢台市seo服务
  • 怎吗做网站挣钱搜索引擎排行榜
  • 网站建设找推推蛙疫情最新数据消息
  • 重庆网上办seo教程技术优化搜索引擎
  • 视频网站如何做国际新闻最新消息10条
  • 北京建站软件上海企业seo
  • 贸易公司寮步网站建设sem工具是什么