Articles of winapi

隐式与显式链接到一个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()?

Winapi:获取具有特定文件句柄的进程

目前我有一个软件,它有一个文件filter驱动程序,在安装软件时,驱动程序以这种方式启动服务: CreateService(serviceManager, name, displayName, SERVICE_START | DELETE | SERVICE_QUERY_STATUS | SERVICE_STOP, SERVICE_FILE_SYSTEM_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path, NULL, NULL, NULL, NULL, NULL); 其中path是C:\Program Files(x86)\TSU\driver\TSUfsd.sys 。 我遇到的问题是在卸载软件的过程中。 当软件试图删除TSUfsd.sys文件时,它使我拒绝访问。 我已经检查过软件是如何删除驱动程序的,并且使用DeleteService函数删除它,并等待服务将其状态从SERVICE_STOP_PENDING更改为SERVICE_STOPPED ,如果在一段时间之后没有发生,则获取服务PID和使用ProcessTerminate杀死它,然后尝试使用rmdir /S /QC:\Program Files(x86)\TSU\删除该文件。 我试图find可能有文件句柄(使用Process Explorer)的进程,但是找不到任何文件。 然后我想也许这个服务还活着,所以我input了sc query TSUfsd但是服务也没有了。 我也尝试更改权限并将完全权限授予我的用户,但同样的错误仍然发生。 所以我的问题是: 有没有其他的方法来检查哪个进程(或其他)可以拥有一个文件? 我也注意到,每当我尝试用Cygwin( rm TSUfsd.sys )删除文件时,它都会删除文件,而不会出现问题。 用cmd( del /f <filename> )和cygwin删除文件有什么区别?

在本地代码中使用Windows环境variables

// I have a permission to create a file to Program Files const std::wstring sFileName = L"%ProgramFiles%\\aaa.txt"; HANDLE h = CreateFileW( sFileName.c_str(), GENERIC_READ, FILE_SHARE_DELETE, 0, CREATE_ALWAYS, 0, 0); // INVALID_HANDLE_VALUE with ERROR_PATH_NOT_FOUND 我期望它使得C:\ Program Files \ aaa.txt或C:\ Program Files(x86)\ aaa.txt取决于Os的环境。 但它没有工作。 怎么了? 如何在本地代码中使用环境variables?

如何通过扫描码(而不是虚拟键码)获得关键状态?

反正有没有使用扫描码来获得键盘按键的状态(是closures还是closures)? 我找不到在win32中的任何function。 任何人都知道任何方式来实现这个 PS我需要键盘的实际状态,而不是从GetKeyState返回的Windows消息派生的状态。

获取有关Windows7中隐藏的托盘图标的信息

我试图获取有关Windows 7中的系统托盘图标的信息。我只能在“用户推荐的通知区域”ToolBarWindow32中的可见图标上这样做。 但是我怎样才能获得有关隐藏图标的信息?