Articles of winapi

获取桌面/ 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

在Windows中平滑调整窗口大小(使用Direct2D 1.1)?

它让我感到困扰,Windows中调整窗口的大小不像我想要的那样“顺利”(这是Windows程序的一般情况,不仅仅是我自己的情况,Visual Studio就是一个很好的例子)。 它使操作系统及其程序感觉“脆弱”和“便宜”(是的,我关心程序和用户界面的感受 ,同样关心关门的声音和感觉,这是构build质量),这在我看来影响了整体用户体验,最终影响了品牌。 重新调整窗口内容简直跟不上鼠标的移动。 无论何时调整窗口大小,都会产生“口吃”/“闪烁”效果,这是因为在新的resize的内容被绘制之前,窗口的先前大小的内容被重新绘制在新的resize的窗口框架中。 我正在构build一个使用Direct2D 1.1绘制其UI的Win32应用程序(x64),并且考虑到Direct2D的速度,我认为在2014年应该没有必要在操作系统中遭受这种工件。我自己在Windows 8.1上, Windows 7和这个应用程序。 当最大化一个小窗口时,“以前的大小”效果是特别明显的(因为窗口大小的差异足够大以便容易地将在较大窗口的左上angular闪烁的旧内容的图像与新内容随后被涂在它上面)。 这似乎正在发生: (比方说,屏幕上有一个完全呈现的窗口,大小为500 x 500像素)。 我最大化的窗口: 窗框被最大化 旧的500 x 500内容在新框架中绘制,之前.. ..最大化的窗口重新绘制与适当大小的内容。 我想知道是否有任何方法来缓解这个问题(例如,通过拦截Windows消息),并避免在最终重新呈现之前用新内容重新绘制窗口。新的内容发生。 这就像Windows重新绘制自己的窗口,使用任何已经可用的graphics,在使用WM_PAINT消息或类似消息来请求我提供更新的内容之前,麻烦了。 可以这样做吗? 编辑:似乎 WM_WINDOWPOSCHANGING / WM_SIZING 提供了“早期访问”新的大小数据,但我还没有设法抑制旧内容的绘画。 我的WndProc看起来像这样: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_ERASEBKGND: return 1; case WM_PAINT: PAINTSTRUCT ps; BeginPaint(hWnd, &ps); […]

GWL_USERDATA用于存储对象指针的替代方法是什么?

在我工作的Windows应用程序中,我们有一个直接位于Win32上方的定制框架(不要问)。 当我们创build一个窗口的时候,我们通常的做法是通过SetWindowLong(hwnd, GWL_USERDATA, this)把this放在窗口的用户数据区域,这使得我们可以有一个类似MFC的callback或紧密集成的WndProc 。 问题是,这不能在Win64上工作,因为LONG只有32位宽。 这个问题的更好的解决scheme是什么,适用于32位和64位系统?

查找并模拟系统托盘图标上的点击?

我需要弄清楚如何以编程方式从一个单独的应用程序的系统托盘图标中find并select一个上下文菜单项。 我想象得到的唯一方法是使用mouse_event()和一些硬编码的x / y值,并将图标设置为始终显示。 除了一般硬编码的黑客使用,这里的问题是假设图标将保留它的位置(这可能会破坏任何其他应用程序加载/卸载)。 我想知道有没有人知道还有什么其他的办法呢?

有什么办法强制一个进程的工作集在C + + 1GB?

如果我在C ++中使用下面的调用,我希望进程的WorkingSet永远不会低于100MB。 然而,即使我打这个电话,操作系统仍然把工作集重新调整到16MB。 将WorkingSet设置为100MB将通过消除软页面错误(请参见下图)而显着提高应用程序的速度。 我究竟做错了什么? SIZE_T workingSetSizeMB = 100; int errorCode = SetProcessWorkingSetSizeEx( GetCurrentProcess(), (workingSetSizeMB – 1) * 1024 * 1024), // dwMinimumWorkingSetSize workingSetSizeMB * 1024 * 1024, // dwMaximumWorkingSetSize, QUOTA_LIMITS_HARDWS_MIN_ENABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE ); // errorCode returns 1, so the call worked. (专家额外) 实验方法学 我编写了一个testingC ++项目来分配100MB的数据,使工作集超过100MB(在Process Explorer中查看),然后释放该内存。 但是,当我释放内存时,操作系统将WorkingSet重新设置为16MB。 如果你愿意,我可以提供我使用的testingC ++项目。 为什么Windows提供一个调用SetProcessWorkingSetSizeEx(),如果它不似乎工作? 我一定做错了什么。 下图显示了当绿线(工作集)从50MB下降到30MB时,软页面错误(红色尖峰)的数量急剧增加。 更新 最后,我们最终忽视了这个问题,因为它不会影响性能。 […]

通过图像名称获取进程的进程句柄

我需要从C使用Win32最简单的方式获取另一个进程的进程句柄的可执行文件名。 我正在寻找的过程没有任何注册的窗口类。 我也知道,如果它正在运行,将只有一个它正在运行的实例。

如何从Windows应用程序检测禁用的networking接口连接?

我想知道什么时候一个接口已被禁用。 如果我进入Windowspipe理器并禁用其中一个启用的连接,GetIfTable()只返回关于1接口的状态,它不再看到断开的连接。 (返回1表) 我怎么能得到的东西,返回的残疾界面仍然存在,但目前禁用? 谢谢。 http://msdn.microsoft.com/en-us/library/aa365943%28VS.85%29.aspx

什么是正确的解决scheme,以支持在文本编辑器中的插入符号运动IAccesible接口?

我想从零开始实现一个支持IAccessible接口的文本编辑器。 我正在使用MFC和Win32 API。 当标记文字编辑器(如记事本)中的插入符号位置发生变化时,插入符号移动的相应字母,单词或行将由Narrator,JAWS等客户端工具发出。我不知道如何实现此function。 我search互联网并阅读MSDN文档。 我在http://msdn.microsoft.com/en-us/library/dd317978.aspx和http://msdn.microsoft.com/en-us/library/dd373892.aspx阅读客户端请求通过AccessibleObjectFromWindow方法从操作系统,和操作系统发送WM_GETOBJECT到应用程序。 WM_GETOBJECT消息在相应的窗口callback函数中收到,但hWnd用于脱字符号移动事件是NULL。 我检查了线程消息队列,但是WM_GETOBJECT在线程消息队列中根本没有收到。 一种有效的方法,但不是正确的解决scheme是打电话 NotifyWinEvent( EVENT_OBJECT_NAMECHANGE, hwnd, OBJID_CLIENT, CHILDID_SELF ) 当用户移动插入符时。 当客户要求更改的名称时,我会返回与相关的脱字符号相关的文字。 HRESULT CMyEditor::get_accName(VARIANT varChild, BSTR *pszName) { *pszName = SysAllocString( L"CORESPONDING TEXT TO THE CARET MOVEMENT" ); return S_OK; }