Articles of winapi

需要将应用程序带到Windows上的前景

我在Windows上使用Qt开发了两个应用程序。 我希望用户能够在一个应用程序中按下一个button,使其他应用程序到达前台。 (程序使用QLocalSocket和命名pipe道进行通信。) 目前我正在使用Qt的QWidget :: activateWindow(),偶尔会将应用程序带到前台,但大多数时候它只是突出显示任务栏上的程序。 有人可以告诉我如何做到这一点,最好使用Qt,尽pipe如果使用WIN32 API会失败。 不幸的是,我只能用Qtfind一种方法。 我使用Chris Becke的build议从当前活动的应用程序中调用SetForegroundWindow来解决这个问题。

在全屏3D应用程序中获取桌面的屏幕截图

使用全屏3D应用程序(如游戏)时,是否可以将桌面渲染成屏幕截图? 或者在游戏运行时,Windowsclosures渲染引擎? 我正在寻找方法将桌面渲染成我的游戏中的纹理。 RDP可以像协议一样解决吗? 编辑:为了澄清,是否有任何深层次的API机制强制渲染到另一个缓冲区,例如当屏幕截图。 没关系,如果只是Windows 7或Windows 8/9。

使用windows api读取当前安装的应用程序版本

我试图使用Windows API来找出已安装的应用程序的版本信息。 我使用升级代码来查找使用MsiEnumRelatedProducts API的产品代码,但是当我尝试使用产品代码使用MsiGetProductInfo时,版本信息作为垃圾回来。 这里是我的MsiGetProductInfo api: [DllImport("msi.dll", CharSet = CharSet.Unicode)] private static extern Int32 MsiGetProductInfo( string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); MsiGetProductInfo(sbProductCode, "INSTALLPROPERTY_INSTALLVERSION", builder, ref len); 任何想法,我在做什么错了?

从Windows模块中的资源中提取文件

下面的代码执行,但它只提取一个空的位图文件。 任何想法,以什么是错的呢? void Extract(WORD wResId , LPSTR lpszOutputPath) { //example: Extract(IDB_BITMAP1, "Redrose.bmp"); HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , RT_BITMAP); HGLOBAL hLoaded = LoadResource( NULL,hrsrc); LPVOID lpLock = LockResource( hLoaded); DWORD dwSize = SizeofResource(NULL, hrsrc); HANDLE hFile = CreateFile (lpszOutputPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); DWORD dwByteWritten; WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL); CloseHandle(hFile); FreeResource(hLoaded); }

Windows 10等效的LaunchAdvancedAssociationUI

自Windows 10以来, IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI方法不再起作用。 在Windows Vista 7和8上,它将打开指定应用程序的“ 设置程序关联”页面上的“控制面板”。 在Windows 10上,它只显示这个popup窗口: 要更改您的默认应用程序,请转至设置>系统>默认应用程序。 截图: 它甚至logging在MSDN中: 从Windows 10开始,这不会启动关联对话框。 它向用户显示一个对话框,通知他们可以在设置中更改用于打开文件扩展名的默认程序 有没有一种替代方法来以编程方式在Windows 10中为我的应用程序打开“ 设置程序关联”页面? 还是有另一种方法build议应用程序允许其用户在Windows 10中自定义关联? 我知道这些部分的解决scheme: 使用,打开控制面板的默认程序页面 %windir%\system32\control.exe /name Microsoft.DefaultPrograms 但用户必须单击“ 设置默认程序” ,在列表中find我的应用程序,然后单击“ select此程序的默认值” 。 有没有办法跳过至less一些步骤? 例如, 设置默认程序页面是否有一个规范名称,或者对于特定于应用程序的页面更好? 使用IApplicationActivationManager打开设置应用程序中的默认应用程序页面: Activator->ActivateApplication( L"windows.immersivecontrolpanel_cw5n1h2txyewy" L"!microsoft.windows.immersivecontrolpanel", L"page=SettingsPageAppsDefaults", AO_NONE, &pid); (Windows 10上的Firefox使用的代码; Chromium使用与@Jichao评论相同的代码 ) 然后,用户可以使用按应用链接设置默认值访问控制面板。 或者使用按协议/文件types链接select默认应用程序 。 我认为这些也可以通过程序直接打开。 我只是不知道一个语法。 除了SettingsPageAppsDefaults页之外,还必须指定SettingsPageAppsDefaultsProtocolView ( SettingsPageAppsDefaultsFileExtensionView )和/或SettingsGroupDefaultApps组。 我不知道怎么。

如何获取GDI句柄的列表

我试图写,使用DLL注入方法,显示另一个程序使用的位图的应用程序,我想要得到它正在使用的GDI句柄(如GDIView.exe实用程序中的列表)的特定进程列表。 我find了关于NtQuerySystemInformation函数的文章,但是这个描述只适用于内核对象的句柄。 有人可以帮忙吗?

EnumProcesses()与CreateToolhelp32Snapshot()

我想知道在两个Win32 API函数EnumProcesses()和CreateToolhelp32Snapshot()之间是否存在任何差异 – 主要是性能方面的差异 – 枚举所有活动的进程和加载的模块。 或者,如果一个比另一个更好使用,为什么。

使用Win32使窗口透明?

使用Python Win32扩展,如何使Windows XP上的任意窗口透明?

为什么模拟鼠标单击(使用mouse_event)只能在选定的组件上工作?

我有多个游标(这实际上是forms),可以由其各自的鼠标控制。 (1个用户为1个光标)。 我使用SetCursorPos将默认游标(原始系统游标)放置在不会从我的应用程序中ShowCursor(false)焦点的位置,并使用ShowCursor(false)来隐藏它。 我有一个类,获取鼠标的手柄和坐标 。 当用户点击时,我使用SetCursorPos和mouse_event来模拟特定位置的点击。 我的模拟鼠标点击只适用于某些组件的OnClick事件(它应该只是button和标签,但是我试验了我的项目上的东西,只是为了知道什么会或不会工作): 它适用于: button(TButton,TBitBtn,TAdvSmoothButton) TAdvGrid TMenuItem(但是TMainMenu的直接子) TRadioButton 它不适用于: 的TLabel 面板(TPanel,TAdvSmoothPanel) TCoolBar TMenuItem(不是TMainMenu的直接子) 这是我的代码: SetCursorPos(currentX , currentY); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 为什么它不能在一些组件上工作? 有没有解决方法(因为我想能够使用mouse_event单击标签)。 编辑:我试着检查点击function是否真的叫,所以我把ShowMessage('clicked'); 在SetCursorPos和mouse_event之前……但奇怪的是一切(小编辑:除了MenuItems之外的所有东西)现在工作正常(除了我每次尝试点击某个东西时popup一个消息)。 有没有人有一个想法,为什么这样performance?

GetSystemInfo(在Windows上)总是返回逻辑处理器的数量吗?

阅读这篇文章,特别是阅读微软文档,看起来应该是返回PHYSICAL处理器的数量,并且你应该使用GetLogicalProcessorInformation来计算出你有多less个LOGICAL处理器。 这里是我在SYSTEM_INFO结构上find的文档: http : //msdn.microsoft.com/en-us/library/ms724958 (v=VS.85).aspx这里是GetLogicalProcessorInformation上的文档:(空间添加到通过垃圾邮件筛选器) http:// msdn.microsoft.com/ en-us / library / ms683194.aspx 在进一步阅读这篇文章的时候,在大多数关于这个主题的讨论中,开发人员都说GetSystemInfo(和SYSTEM_INFO结构)报告了LOGICAL处理器的数量。 当我再次search时,我发现MS确实发布了一些关于这个(和一个热修复)的信息,在这里(通过垃圾邮件filter添加的空间): http:// support。 microsoft.com/ kb / 936235 读取它,听起来像是在Service Pack 3之前的Xp,GetSystemInfo报告SYSTEM_INFO结构中LOGICAL处理器的数量。 它还告诉我,在Windows Vista和Windows 7上,GetSystemInfo应报告PHYSICAL处理器的数量(与Windows XP Service Pack 3不同)。 有谁知道它实际上做了什么? GetSystemInfo是否真的以不同的方式报告物理处理器的数量(在同一台计算机上),具体取决于它在哪个操作系统上运行?