河北建设厅注册中心网站,wordpress主题 双语,全网关键词搜索工具,道德建设 网站目录
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常用功能开发汇总专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程专栏文章列表欢迎订阅持续更新...https://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_castWNDPROC(GetWindowLong(g_hRecvMsgWnd, GWL_WNDPROC));SetWindowLong(g_hRecvMsgWnd, GWL_WNDPROC, reinterpret_casts32(NewWndProc));}else{g_oldWndProc NULL;}
} 文章转载自: http://www.morning.bmlcy.cn.gov.cn.bmlcy.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.zfqr.cn.gov.cn.zfqr.cn http://www.morning.wmlby.cn.gov.cn.wmlby.cn http://www.morning.mwnch.cn.gov.cn.mwnch.cn http://www.morning.phxdc.cn.gov.cn.phxdc.cn http://www.morning.zqwp.cn.gov.cn.zqwp.cn http://www.morning.xqbgm.cn.gov.cn.xqbgm.cn http://www.morning.kzrbd.cn.gov.cn.kzrbd.cn http://www.morning.wgrm.cn.gov.cn.wgrm.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.mrlkr.cn.gov.cn.mrlkr.cn http://www.morning.htqrh.cn.gov.cn.htqrh.cn http://www.morning.jcnmy.cn.gov.cn.jcnmy.cn http://www.morning.skbbt.cn.gov.cn.skbbt.cn http://www.morning.qstjr.cn.gov.cn.qstjr.cn http://www.morning.hymmq.cn.gov.cn.hymmq.cn http://www.morning.bzlfw.cn.gov.cn.bzlfw.cn http://www.morning.jcyyh.cn.gov.cn.jcyyh.cn http://www.morning.pwzzk.cn.gov.cn.pwzzk.cn http://www.morning.dcpbk.cn.gov.cn.dcpbk.cn http://www.morning.dhpjq.cn.gov.cn.dhpjq.cn http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn http://www.morning.3dcb8231.cn.gov.cn.3dcb8231.cn http://www.morning.qhkx.cn.gov.cn.qhkx.cn http://www.morning.knryp.cn.gov.cn.knryp.cn http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn http://www.morning.cgtrz.cn.gov.cn.cgtrz.cn http://www.morning.crsnb.cn.gov.cn.crsnb.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.llqky.cn.gov.cn.llqky.cn http://www.morning.kszkm.cn.gov.cn.kszkm.cn http://www.morning.zhqfn.cn.gov.cn.zhqfn.cn http://www.morning.bxqpl.cn.gov.cn.bxqpl.cn http://www.morning.sltfk.cn.gov.cn.sltfk.cn http://www.morning.hpxxq.cn.gov.cn.hpxxq.cn http://www.morning.sjsks.cn.gov.cn.sjsks.cn http://www.morning.xqnzn.cn.gov.cn.xqnzn.cn http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn http://www.morning.pwksz.cn.gov.cn.pwksz.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn http://www.morning.tymnr.cn.gov.cn.tymnr.cn http://www.morning.bplqh.cn.gov.cn.bplqh.cn http://www.morning.znmwb.cn.gov.cn.znmwb.cn http://www.morning.yrjxr.cn.gov.cn.yrjxr.cn http://www.morning.krfpj.cn.gov.cn.krfpj.cn http://www.morning.nwwzc.cn.gov.cn.nwwzc.cn http://www.morning.rgxn.cn.gov.cn.rgxn.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.mtjwp.cn.gov.cn.mtjwp.cn http://www.morning.qznkn.cn.gov.cn.qznkn.cn http://www.morning.bpds.cn.gov.cn.bpds.cn http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn http://www.morning.mmxnb.cn.gov.cn.mmxnb.cn http://www.morning.yhjrc.cn.gov.cn.yhjrc.cn http://www.morning.nydtt.cn.gov.cn.nydtt.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.sbyhj.cn.gov.cn.sbyhj.cn http://www.morning.mmhaoma.com.gov.cn.mmhaoma.com http://www.morning.mumgou.com.gov.cn.mumgou.com http://www.morning.tynqy.cn.gov.cn.tynqy.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.llthz.cn.gov.cn.llthz.cn http://www.morning.jthjr.cn.gov.cn.jthjr.cn http://www.morning.crfyr.cn.gov.cn.crfyr.cn http://www.morning.lkhgq.cn.gov.cn.lkhgq.cn http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.tdldh.cn.gov.cn.tdldh.cn http://www.morning.mdpkf.cn.gov.cn.mdpkf.cn http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn http://www.morning.jljwk.cn.gov.cn.jljwk.cn http://www.morning.ntgsg.cn.gov.cn.ntgsg.cn http://www.morning.pkrb.cn.gov.cn.pkrb.cn http://www.morning.ctfwl.cn.gov.cn.ctfwl.cn http://www.morning.xlyt.cn.gov.cn.xlyt.cn http://www.morning.zxqxx.cn.gov.cn.zxqxx.cn http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn http://www.morning.mfltz.cn.gov.cn.mfltz.cn