Articles of winapi

如何获取与打开的句柄关联的名称

在Win32下打开HANDLE的文件名最简单的方法是什么?

winapi:CreateProcess但隐藏进程的窗口?

我正在使用CreateProcess来创build一个cmd.exe进程,它传递一个参数,它将执行并退出,这使得命令提示符在屏幕上闪烁。 我试图通过将STARTUPINFO结构wShowWindow设置为SW_HIDE来避免这种情况,但此参数似乎影响调用窗口,而不是执行进程的窗口。 有无论如何,你可以使用createprocess启动一个隐藏的视图的程序? 另外什么是适当的WINAPI标准的方式来获得环境variables?

把窗口放到前面 – > raise(),show(),activateWindow()不起作用

在我的Qt应用程序中,我在默认浏览器中打开一个URL。 之后我想把应用程序的主窗口再次带到前面。 我尝试了所有可以find的方法,但都没有成功。 它所做的只是在窗口7的任务栏中闪烁。下面是一个例子: this->viewer->show(); this->viewer->raise(); this->viewer->activateWindow(); * viewer是一个指向从QDeclarativeView派生的QmlApplicationViewer的指针

为每个显示器的高DPI支持缩放非客户端区域(标题栏,菜单栏)

Windows 8.1引入了针对不同显示器具有不同DPI设置的function。 此function被称为“每监视器高DPI支持”。 它坚持并在Windows 10中进一步完善 。 如果应用程序没有select( 即不识别DPI或识别高DPI),DWM会自动将其扩展到适当的DPI。 大多数应用程序属于这两个类别之一,包括与Windows捆绑在一起的大多数应用程序( 例如记事本)。 在我的testing系统中,高DPI显示器设置为150%(144 DPI),而普通显示器设置为系统DPI(100%显示,96 DPI)。 因此,在高DPI屏幕上打开其中一个应用程序(或将其拖到那里)时,虚拟化将会启动,放大所有内容,但也使其变得难以置信的模糊。 另一方面,如果应用程序明确指出它支持每个监视器的高DPI,则不执行虚拟化,开发人员负责缩放。 微软在这里有一个相当全面的解释* ,但为了一个自包含的问题,我将总结。 首先,您通过在清单中设置<dpiAware>True/PM</dpiAware>来指示支持。 这使您接收WM_DPICHANGED消息 ,它告诉您新的DPI设置以及为您的窗口build议新的大小和位置。 它还允许您调用GetDpiForMonitor函数并获取实际的 DPI,而不会出于兼容性原因而撒谎。 肯尼·克尔还写了一个全面的教程 。 我已经在一个小小的C ++testing应用程序中成功完成了这一切。 这是很多的样板,主要是项目设置,所以我在这里发表一个完整的例子没有多less意义。 如果您想对其进行testing,请遵循Kenny的说明, MSDN上的本教程或下载官方SDK示例 。 现在,客户区域中的文本看起来不错(因为我处理了WM_DPICHANGED ),但是由于虚拟化不再执行,所以没有缩放非客户区域。 结果是标题/标题栏和菜单栏的大小错误 – 在高DPI屏幕上它们不会变大: 所以问题是,如何让窗口的非客户区域扩展到新的DPI? 无论您是创build自己的窗口类还是使用对话框,它们在这方面都具有相同的行为。 有人build议 ,没有答案 – 你唯一的select是自定义绘制整个窗口,包括非客户区。 虽然这当然是可能的,事实上UWP应用程序(以前称为Metro)的应用程序(如Windows 10计算器)对于使用许多非客户端小部件并希望看起来是本机的桌面应用程序来说不是一个可行的select。 除此之外,这是明显的错误。 自定义绘制的标题栏不能是获得正确行为的唯一方法,因为Windowsshell团队已经完成了它。 卑鄙的“运行”对话框的行为与预期的完全相同,在不同DPI的监视器之间拖曳时,可以正确调整客户端和非客户端区域的大小: Spy ++的调查证实这只是一个标准的Win32对话框 – 没有什么奇特的。 所有的控件都是标准的Win32 SDK控件。 它不是UWP应用程序,也不是自定义标题栏 – 它仍然具有WS_CAPTION风格。 […]

在Windows中获取另一个进程命令行

我想获得另一个进程命令行(在WinXP 32位)。 我做了以下几点: hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, ProcList.proc_id_as_numbers[i]); BytesNeeded = sizeof(PROCESS_BASIC_INFORMATION); ZwQueryInformationProcess(hProcess, ProcessBasicInformation, UserPool, sizeof(PROCESS_BASIC_INFORMATION), &BytesNeeded); pbi = (PPROCESS_BASIC_INFORMATION)UserPool; BytesNeeded = sizeof(PEB); res = ZwReadVirtualMemory(hProcess, pbi->PebBaseAddress, UserPool, sizeof(PEB), &BytesNeeded); /* zero value returned */ peb = (PPEB)UserPool; BytesNeeded = sizeof(RTL_USER_PROCESS_PARAMETERS); res = ZwReadVirtualMemory(hProcess, peb->ProcessParameters, UserPool, sizeof(RTL_USER_PROCESS_PARAMETERS), &BytesNeeded); ProcParam = (PRTL_USER_PROCESS_PARAMETERS)UserPool; 第一次调用pbi.UniqueProcessID之后是正确的。 […]

访问CPU / RAM的使用(如使用任务pipe理器,但通过API!)?

用Windows API访问“任务pipe理器”信息的具体方法是什么? 我已经做了一些相关的调查,但是我似乎无法find一个API调用来告诉我: 给定进程的CPU / RAM使用情况 这是使用最多的CPU / RAM的过程 有没有办法通过Python或C ++(基本上,通过Windows API)访问这些信息? 这是我本质上想要做的(伪代码): app x = winapi.most_intensive_process app y = winapi.most_RAM_usage print x.name print y.name

未捕获WM_PAINT中的访问冲突

为了testing这个问题,我写了一个最小的Windows应用程序。 如果我在WM_PAINT处理程序中强制访问冲突,这个exception永远不会到达debugging器。 如果在没有debugging器的情况下启动,访问冲突也不会显示出来。 通常你应该得到Windows错误报告对话框。 深入挖掘看来,user32.dll中的某些内容会捕获所有传入的exception。 这是正常的行为? 我能不能控制这个? 没有捕获所有的例外安全风险? 至less这是讨厌的地狱。 这是Vista 64和32位和64位应用程序。在XP上,exception似乎按预期处理。 其他Windows消息也有同样的问题。 也许他们都是? WM_PAINT处理程序: case WM_PAINT: hdc = BeginPaint(hWnd, &ps); *(int*)0 = 0; EndPaint(hWnd, &ps); break;

获取桌面/ shell窗口的句柄

在我的一个程序中,我需要testing用户是否正在关注桌面/shell窗口。 目前我使用user32.dll中的GetShellWindow(),并将结果与​​GetForegroundWindow()进行比较。 这种方法是一直工作,直到有人改变桌面墙纸,但一旦墙纸改变GetShellWindow()的句柄不再匹配从GetForegroundWindow()了,我不明白这是为什么。 ( 操作系统: Windows 7 32位) 有没有更好的方法来检查桌面是否集中? 优选地,如果用户改变壁纸,那么不会损坏的那个? 编辑:我devise了一个解决方法:我正在testing的句柄有一个“SHELLDLL_DefView”类的孩子。 如果有的话,桌面上的焦点。 虽然它在我的电脑上工作,但并不意味着它会一直工作。

如何在C ++中获得屏幕分辨率?

可能重复: 如何从hWnd获得显示器屏幕分辨率? 有没有办法获得在C + +的屏幕分辨率? 我search了MSDN,但没有运气。 我发现最接近的是ChangeDisplaySettingsEx(),但似乎没有办法只是返回res而不改变它。

在Delphi下载文件

谷歌search显示了一些关于如何使用Delphi下载文件的例子,但是大多数是错误的,一半的时间不能用我的经验。 我正在寻找一个简单的强大的解决scheme,这将允许我下载一个单一的exe(用于更新我的应用程序),并将保持当前更新线程的执行,直到下载完成或出错。 该进程已经线程化,所以下载代码应该保持执行,直到完成(希望)。 这里有两个实现,都显得非常复杂 1. http://www.scalabium.com/faq/dct0116.htm http://delphi.about.com/od/internetintranet/a/get_file_net.htm