Articles of winapi

Windows 8/10中活动窗口的进程名称

下面的示例可靠地返回与活动窗口关联的进程的名称,但不适用于较新的现代/通用应用程序,因为它返回Windows 8和ApplicationFrameHost.exe上的助手进程WWAHost.exe的名称Windows 10而不是应用程序的名称。 HWND active_window = GetForegroundWindow(); GetWindowThreadProcessId(active_window, &active_process_id); HANDLE active_process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, active_process_id); GetProcessImageFileName(active_process, image_name, 512); 在Windows 10中,ApplicationFrameHost.exe是创build窗口句柄的过程,它是由GetWindowThreadProcessId()返回的,还有另外一个Win32 API可以用来获取活动的通用应用程序的活动进程吗? 还尝试使用GetApplicationUserModelId()和GetPackageFullName()没有成功,因为它们分别返回APPMODEL_ERROR_NO_APPLICATION和APPMODEL_ERROR_NO_PACKAGE,因为active_process句柄只是辅助进程而不是活动应用程序的进程。 任何其他API用于获取给定窗口的hwnd的Modern / Universal应用程序的进程名称,或以其他方式指出通用应用程序的进程名称是活动的。 提前致谢!

multithreading可以在单个处理器系统上实现吗?

我始终遵循multithreading只能在多处理器系统上实现的概念,即多个处理器分配给每个线程,每个线程可以同时执行。 在这种情况下没有调度,因为每个线程都有单独的资源专用于它。 但是我可以在某处读到它,也可以在单处理器系统上执行multithreading。 这是对的吗? 如果是,那么单处理器和多处理器系统有什么区别?

SetStdHandle对cout / printf没有影响

标题说明了一切。 当我运行下面的代码: HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE hFile = CreateFile(TEXT("Foo.txt"), GENERIC_WRITE, FILE_READ_ACCESS | FILE_WRITE_ACCESS, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); SetStdHandle(STD_OUTPUT_HANDLE, hFile); std::cout << "Hello, "; printf("world!\n"); WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), "Hello, world!\n", 13, NULL, NULL); SetStdHandle(STD_OUTPUT_HANDLE, hOut); CloseHandle(hFile); 结果是, Hello, world! 由于对cout和printf的调用以及Hello, world!而被写入控制台Hello, world! 由于对WriteFile的调用,也被写入文件Foo.txt 。 我的假设是,当一切都在开始初始化时,由GetStdHandle返回的HANDLE被caching并重用于cout和printf 。 这是完全合理的,正是我想要的,因为我认为GetStdHandle需要调用操作系统(可能会很长!)。 麻烦的是我想覆盖这个行为,如果可能的话,用应用程序的标准句柄“同步”cout和printf。 在提出任何替代scheme之前,让我准确地描述一下我正在做的事情(是的,我知道为此可以使用freopen )。 我需要做的是在修改之前将当前的标准输出句柄“保存”在一个类似于堆栈的数据结构上,以便能够恢复以前的输出句柄。 任何短小的情况都是不可接受的(即我无法恢复到CONOUT$等)。 这需要有recursion的能力。 也就是说,以下内容应该如你所期望的那样工作: std::cout << "A1" […]

我应该用什么来取代Windows上的gettimeofday()?

我正在编写一个可移植的Socket类,它支持发送和接收超时…为了实现这些超时,我使用了select() ….但是,我有时需要知道在select()这当然在Linux上,我会通过调用gettimeofday()之前和之后调用select()然后使用timersub()来计算delta …实现… 鉴于Windows上的select()接受struct timeval超时,我应该使用什么方法来取代Windows上的gettimeofday()?

Win32:如何枚举subprocess?

在Win32下枚举当前正在运行的进程的subprocess的最好方法是什么? 我可以想到一些方法来做到这一点,但他们似乎过于复杂和缓慢。 以下是解决scheme的要求: 具体而言,我需要知道是否有任何当前正在运行的进程是由当前进程启动的。 将运行在WinXP上,不应该要求分发特殊的DLL。 不应该需要大量的CPU开销(它将在后台定期运行)。 我最终会用Delphi写这个,但是我可以从任何你有代码的语言中进行转换。大多数情况下,我正在寻找最有效的一组Win32 API来使用。 谢谢!

使用Windows 7集成编写名称空间扩展

我是新的主题shell扩展,我正在寻找有关命名空间扩展的资源。 我想写一个支持SFTP的命名空间扩展,所有的选项在浏览器中像FTP一样浏览。 我从codeproject上看了一下zengxi的例子1,2 ,但是他们编译不对,好像老了。 我认为,地址栏中的文件夹select也有很多变化。 有人可以给我一些正确的方向或一些工作的例子资源? 更新:重要的是来源是免费的。 这是一个非营利性项目。 目前我在MSDN上find了一个名为Explorer Data Provider Sample的好源代码。 这是最新的,并提供一些别名Explorer Data Provider和Shell Data Source 。 还缺less的是拖放支持和一个支持协议链接的胶水。 对于将来的使用,find一种将文件扩展名与该压缩文件的shell data source相关联的方法是非常好的。

如何使用控制台应用程序中的仅消息窗口接收消息?

我创build了一个简单的Win32控制台应用程序,创build一个隐藏的只有消息的窗口并等待消息,完整的代码如下所示。 #include <iostream> #include <Windows.h> namespace { LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_COPYDATA) std::cout << "Got a message!" << std::endl; return DefWindowProc(hWnd, uMsg, wParam, lParam); } } int main() { WNDCLASS windowClass = {}; windowClass.lpfnWndProc = WindowProcedure; LPCWSTR windowClassName = L"FoobarMessageOnlyWindow"; windowClass.lpszClassName = windowClassName; if (!RegisterClass(&windowClass)) […]

Win32剪贴板和Alpha通道图像

我的应用程序应该能够将32位图像(RGB + alpha通道)复制到剪贴板,并从剪贴板粘贴这些图像。 为此,我计划使用CF_DIBV5因为BITMAPV5HEADER结构有一个字段bV5AlphaMask 。 问题在于,如何将图像数据存储在剪贴板中似乎并没有达成共识。 在做一些testing时,我发现应用程序之间有几处不同之处,使得几乎不可能提出一个通用的解决scheme。 这是我的观察: 当我从Word 2010或XnView中将Alpha通道图像复制到剪贴板时,它的存储没有预乘像素数据。 但是,当我使用Firefox或Chrome复制图像时,像素数据似乎被Alpha通道预乘。 Firefox将bV5AlphaMask设置为0xff000000,而大多数其他应用程序根本不设置它,但保持为0.这很奇怪,因为这些应用程序将DIB放到剪贴板上,实际上包含最高8位的alpha通道,但仍将bV5AlphaMask设置为0。所以必须假设,即使bV5AlphaMask为0,如果比特深度是32,那么也有一个alpha通道。 长话短说我的基本问题是:是否有一些alpha通道数据应该如何存储在剪贴板的官方信息? 我特别想知道数据是否必须预乘。 正如你所看到的,Word 2010和XnView不会预览,而Firefox和Chrome则是。 但是要知道色彩通道是否应该被预乘是非常重要的。 非常感谢您为此发表了一些看法! 更新2现在粘贴到Paint.NET工作正常。 这是由于我的代码中的错误,如果alpha通道为0,没有将颜色通道设置为0,也就是说,在这种情况下预处理没有正确完成,这似乎使Paint.NET混淆了。 仍然没有解决的是Internet Explorer 10的问题。当将带有alpha通道的PNG复制到剪贴板时,IE 10只是将24位CF_DIBV5放在剪贴板上,但Paint.NET可以将此位图粘贴到alpha通道,所以必须有另一种格式IE 10暴露给剪贴板。 也许它暴露了一个PNG使用CFSTR_FILECONTENTS和CFSTR_FILEDESCRIPTOR。 更新我现在已经用下面的arx描述的方式实现它,它工作得很好。 但是,还有两件事让我感到困惑: 1)将我的应用程序中的Alpha通道图像粘贴到Paint.NET不保留Alpha通道。 在Paint.NET中图像显示不透明。 然而,从Firefox和Chrome粘贴到Paint.NET完美的作品,alpha通道保留! 我甩掉了完整的DIBV5,它与我的应用程序完全相同,但它仍然适用于FF和Chrome,但不适用于我的应用程序,所以必须有其他的东西! Firefox和Chrome必须做别的事情,我的应用程序不做!? 2)对于Internet Explorer 10也是如此。从IE 10粘贴到我的应用程序的Alpha通道图像根本不起作用…我得到了深度为24的DIB,即没有Alpha通道所有。 当从IE 10粘贴到Paint.NET时,Alpha通道就在那里! 所以这里一定还有更多的东西

发送一个鼠标点击任务栏中的一个button使用C#

在我目前正在开发的应用程序中,需要将外部应用程序的窗口放在前台。 使Win32 API调用(如BringWindowToTop和SetForeground窗口)不会一直工作。 这是由于Windows XP中的一些限制。 我想要做的是发送模拟鼠标点击任务栏上的窗口button,我希望将窗口的前面。 有谁知道这是可能的?

我可以允许多个程序同时读取同一个文件吗?

我有一个应用程序读取一组数据文件并执行一些模型计算。 该程序不需要修改数据文件本身,所以我现在打开它们的只读标志,如下所示: FILE* file; if(_wfopen_s(&file, fname.c_str(), L"r") == 0) … 我想同时运行我的程序的几个实例,使用相同的一组数据,但对数据执行不同的计算。 我的程序都不需要修改数据文件。 由于数据文件非常大,我无法将每个程序的数据分别复制。 我认为,因为我打开具有只读权限的文件,两个程序可以同时读取同一个文件。 相反,我得到了各种各样的错误,“文件无法打开,因为它被另一个进程使用”。 由于我的开发环境是Windows 7, 这个问题表明这可能是一个启用阅读共享的问题 。 但是,该线程中的所有答案依赖于CreateFile ,而我正在处理用stdio.h编写的遗留代码。 有没有一种方法可以使用fopen类的函数同时从文件中读取多个程序?