Articles of winapi

我怎样才能从一个单独的线程处理窗口消息?

我希望启动一个单独的线程来处理窗口消息(通过阻塞的GetMessage循环),但是仍然在初始线程中创build窗口。 在单独的线程中,只要它启动,我就用PM_NOREMOVE调用PeekMessage来确保消息队列的存在(是否有必要?),然后.. AttachThreadInput(initial thread id,GetCurrentThreadId(),true) ..最后进入消息循环 我还没有使用互斥体或cs来确保这是及时发生的,但是为了简单起见,我仅仅在最初的线程中使用了一个Sleep语句。 无论如何,窗口消息似乎不被单独的线程拦截。 我有些不确定我是否正确地做了这件事,并且希望得到任何可能的指导。 两个线程都在同一个进程中 谢谢你们

有没有API来启用/禁用Windows 8.1上的蓝牙?

在Windows 8 / 8.1中,现在可以通过操作系统本身启用/禁用蓝牙(参见下图)。 这是真棒,因为它是设备/驱动程序不可知的。 在Android上,这可以通过BluetoothAdapter.enable()和BluetoothAdapter.disable()来实现 ,但是我一直没能在Windows上find任何可以做到这一点的东西(尽pipe看起来确实是这样)。 所以我试过使用: BluetoothEnableIncomingConnections() – 但是,这只能阻止新的传入连接。 它不禁用现有的。 devcon.exe – 这个方法的问题是A.它是一个不可再分发的二进制B.它要求你提前知道他的设备ID(所以它不是设备/驱动程序不可知的)。 另外,虽然它不是一个破坏者,它不会需要提升。 UI自动化 – 简单地启动PC设置应用程序,并通过键盘事件来切换开关很容易,但是在适当的编码实践和用户体验方面,这是非常难看的。 这就是说,这是我发现实现我到目前为止的行为的唯一途径。 我正在用C ++编写一个原生的Win32应用程序,所以我不受限于任何Windows应用程序的应用程序需求,但是,如果有一个不需要提升的方法,那将是非常好的。 TL; DR 是否有任何API,WMI接口或其他任何可用的function来实现function上等效的结果来翻转蓝牙拨动开关? 如果没有,有没有其他方法可以产生类似的结果?

Windows上的“正确”对话框/ UI字体

当使用CreateWindowdynamic创build控件(例如编辑控件)时,通常以丑陋(粗体无衬线)字体开始。 通常我通过抓住父对话框的字体并将其设置为控件来解决这个问题 – 我甚至不能说这是个好主意。 我如何“合法”获取正确的字体?

无法读取与代码页不匹配的FileVersionInfo

我有一些合理的尝试和testing的代码,它使用Windows API调用读取FileVersionInfostring,如“FileVersion”和“CompanyName”。 我发现它与一个特定的第三方DLL失败。 问题似乎是这样的: 读取\VarFileInfo\Translation值,我得到040904B0 (美国英语,Unicode)。 但是当我然后尝试调用\StringFileInfo\040904B0\CompanyName VerQueryValue时,它将返回false。 但是调整代码以使用Windows Latin-1 ANSI代码页可以工作: \StringFileInfo\040904E4\CompanyName 。 因此,string表中的代码页与\VarFileInfo\Translation值不匹配。 根据MSDN VERSIONINFO资源文档底部的示例资源,这是一个合适的事情! 鉴于此,我可以使用发布的VersionInfo API正确读取此文件的string,而不用“猜测”代码页?

隐式与显式链接到一个DLL

什么时候应该隐式地或者明确地链接到一个DLL,什么是常见的做法或者陷阱?

如何使用Win32 API获取多个显示器的显示名称?

我有两个显示器连接到我的Windows PC – 一个是正常的显示器,另一个是投影机。 因为Windows不一致地分配一个或另一个作为主监视器(部分原因是它们并不总是在Windows引导时),所以我需要以编程方式检测哪个监视器是哪个。 控制面板将显示器的名称显示为“HP 2159”(普通显示器)和“PROJECTOR”,在您select的主显示器的屏幕上显示。 这是我想要在我的程序中获得的信息。 我找不到这个信息的正确的Win32 API函数。 我已经尝试了EnumDisplayDevices和EnumDisplayMontiors 。 两者都只是将“DISPLAY1”和“DISPLAY2”作为设备名称。 我应该用什么来获得“HP 2159”和“PROJECTOR”信息或类似的东西? 更新:这是我正在使用的Python代码: >>> import win32api >>> monitors = win32api.EnumDisplayMonitors() >>> win32api.GetMonitorInfo(monitors[0][0]) {'Device': '\\\\.\\DISPLAY1', 'Work': (0, 0, 1920, 1080), 'Flags': 1, 'Monitor': (0, 0, 1920, 1080)} >>> win32api.GetMonitorInfo(monitors[1][0]) {'Device': '\\\\.\\DISPLAY2', 'Work': (1920, 0, 3360, 1080), 'Flags': 0, 'Monitor': (1920, 0, 3360, 1080)}

.NET或Windows同步基元性能规范

我目前正在撰写一篇科学文章,在那里我需要非常确切地引用。 有人可以指向我MSDN,MSDN文章,一些发表的文章来源或一本书,在那里我可以findWindows或.NET同步原语的性能比较。 我知道这些是在下降的性能顺序:互锁API,关键部分,.NETlocking语句,监视器,互斥体,EventWaitHandle,信号量。 非常感谢, Ovanes PS我发现了一本好书: Joe Duffy在Windows上的并发编程 。 本书是由.NET Framework的头部并发开发人员之一编写的,其内容非常精彩,有很多解释,如何工作或实现。

STL容器泄漏

我正在使用一个vector容器来保存包含3个整数和2个std::string的对象的实例,这是在堆栈上创build的,并从另一个类的函数中填充,但通过deleaker运行应用程序显示std::string从对象的std::string s都泄漏。 代码如下: // Populator function: void PopulatorClass::populate(std::vector<MyClass>& list) { // m_MainList contains a list of pointers to the master objects for( std::vector<MyClass*>::iterator it = m_MainList.begin(); it != m_MainList.end(); it++ ) { list.push_back(**it); } } // Class definition class MyClass { private: std::string m_Name; std::string m_Description; int m_nType; int m_nCategory; int m_nSubCategory; }; // Code […]

警告窗口一旦用户尝试停止服务

我正在写一个服务“C”,我想显示一个警告窗口,一旦用户试图停止服务(“确定”和“取消”button)。 是否有任何特定的Windows API可用来实现这一目标? 任何其他简单的方法都可以实现?

只为进程初始化关键部分一次

在一个multithreading的应用程序,有没有一种方法来确保只有一个关键部分初始化,除了把代码放在DLL main()?