草庐IT

c++ - 如何创建一个以 HWND 作为父级的 QWidget?

对于wxWidgets,我使用以下代码:HWNDmain_window=......wxWindow*w=newwxWindow();wxWindow*window=w->CreateWindowFromHWND(0,(WXHWND)main_window);如何在Qt中做同样的事情?HWND是我希望作为新QtWidget的父窗口的窗口句柄。 最佳答案 使用QWidget的create方法。HWNDmain_window=......QWidget*w=newQWidget();w->create((WinId)main_windo

windows - SendMessage(HWND_BROADCAST, ....) 挂起

当我将SendMessage函数与HWND_BROADCAST一起使用时,应用程序挂断了。应用长时间无响应。谁能解释一下为什么? 最佳答案 当有一个进程有一个顶级窗口,但没有在创建该窗口的线程上调用GetMessage或PeekMessage时,就会发生这种情况。为了与Windows3.0向后兼容,SendMessage将不会返回,直到系统中的所有顶级窗口都响应了您的广播。在Windows成为多线程之前,这种行为是有意义的,因为SendMessage(),即使发送到其他进程也永远不会阻塞。但是从Win32开始,当您向另一个进程中的窗

windows - EnumWindows 返回句柄的顺序有意义吗?

从几个初步测试看来EnumWindows总是以相反的实例化顺序返回窗口,即最近实例化的窗口最先。这是一个有效的观察吗?如果是这样,是否适用于所有版本的Windows?这是一个可靠的假设吗,即该行为是否记录在某处?上下文:我正在处理这样一种情况,我正在触发第三方应用程序打开几个非模态窗口,我需要在这些窗口打开后向它们发送一些窗口消息,但我没有可靠的方法来识别它们,因为它们的窗口类和标题都不会不同,而且我也不知道它们的预期坐标。但是,如果我可以依赖EnumWindows的上述行为,我可以简单地使用EnumWindows返回的第一个句柄,其类和标题符合我的期望。这仍然留下了一些假设的循环漏洞

c++ - 获取当前进程的 HWND

我有一个使用窗口API的c++进程。我想获得自己进程的HWND。请指导我如何使它成为可能。 最佳答案 如果您正在谈论获取process句柄,那么它不是HWND(这是一个windowhandle),而是一个HANDLE(即内核对象句柄);要检索相对于当前进程的伪句柄,可以使用GetCurrentProcess正如其他人解释的那样。另一方面,如果你想获得一个HWND(一个window句柄)到你的应用程序的主窗口,那么你必须遍历现有的窗口与EnumWindows并通过GetWindowThreadProcessId检查其所有权,将返回的进

c++ - 获取当前进程的 HWND

我有一个使用窗口API的c++进程。我想获得自己进程的HWND。请指导我如何使它成为可能。 最佳答案 如果您正在谈论获取process句柄,那么它不是HWND(这是一个windowhandle),而是一个HANDLE(即内核对象句柄);要检索相对于当前进程的伪句柄,可以使用GetCurrentProcess正如其他人解释的那样。另一方面,如果你想获得一个HWND(一个window句柄)到你的应用程序的主窗口,那么你必须遍历现有的窗口与EnumWindows并通过GetWindowThreadProcessId检查其所有权,将返回的进

c++ - 如何在 Win x64 中的 32 位和 64 位应用程序之间共享 HWND?

MSDN告诉我,窗口句柄(HWND)可以在32位和64位应用程序之间共享,在InterprocessCommunication中(MSDN)。但是,在Win32中,HWND是32位,而在64位Windows中,它是64位。那么如何共享句柄呢?我猜同样的问题也适用于命名对象的句柄,例如互斥锁、信号量和文件句柄。 最佳答案 正如DanielRose在上面指出的那样,MSDNdocumentation现在声明:...itissafetotruncatethehandle(whenpassingitfrom64-bitto32-bit)or

c++ - 如何在 Win x64 中的 32 位和 64 位应用程序之间共享 HWND?

MSDN告诉我,窗口句柄(HWND)可以在32位和64位应用程序之间共享,在InterprocessCommunication中(MSDN)。但是,在Win32中,HWND是32位,而在64位Windows中,它是64位。那么如何共享句柄呢?我猜同样的问题也适用于命名对象的句柄,例如互斥锁、信号量和文件句柄。 最佳答案 正如DanielRose在上面指出的那样,MSDNdocumentation现在声明:...itissafetotruncatethehandle(whenpassingitfrom64-bitto32-bit)or

c++ - 确定 HWND 是否代表顶级窗口的最佳方法是什么?

是否检查WS_CHILD位:LONGstyle=GetWindowLong(hwnd,GWL_STYLE);intisTopLevel=!(style&WS_CHILD);或者有更好的方法吗?假设:直接C调用仅现有的WindowsAPI代码。 最佳答案 方式#1:测试hWnd==GetAncestor(hWnd,GA_ROOT)方式#2:使用IsTopLevelWindow(user32Win7,未记录) 关于c++-确定HWND是否代表顶级窗口的最佳方法是什么?,我们在StackOve

c++ - 如何获取 ShellExecuteEx.. hProcess 打开的窗口的 hWnd?

这个“简单”的问题似乎充满了次要问题。例如。新进程是否打开多个窗口;它有启动画面吗?有简单的方法吗?(我正在启动一个新的Notepad++实例)...std::tstringtstrNotepad_exe=tstrProgramFiles+_T("\\Notepad++\\notepad++.exe");SHELLEXECUTEINFOSEI={0};sei.cbSize=sizeof(SHELLEXECUTEINFO);sei.fMask=SEE_MASK_NOCLOSEPROCESS;sei.hwnd=hWndMe;//Thisapp'swindowhandlesei.lpVerb

c++ - CWnd::GetSafeHwnd() 和 CWnd::m_hWnd 是线程安全的吗?

我在一个高度多线程的应用程序上遇到了无数次崩溃。阅读这些MSDNpage,technicalnote和thisarticleonTLS,我已经了解CWnd对象被映射到ThreadLocalStorgae(TLS,这是一个线程相关的内存访问)中的HWND。我打算解耦所有看起来像CWnd线程远程访问的东西,并将其转换为HWND引用,然后使用::PostMessage作为通信端口。但是我的一位同事真的坚持要我只在老外线程中保留CWnd*,采用::PostMessage策略ok,但是使用CWnd::GetSafeHwnd()或外部线程中的pMyCWnd->m_hWnd以恢复nativeHWND