Articles of winapi

如何在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时,软页面错误(红色尖峰)的数量急剧增加。 更新 最后,我们最终忽视了这个问题,因为它不会影响性能。 […]

通过WinAPI确定英特尔高清显卡版本

所以我试图通过WinAPI函数获取graphics卡上的信息,但是如何获取我的确切卡信息有一个问题。 我已经编写代码来调用EnumDisplayDevices,并通过我的电话收到DeviceString“英特尔(R)高清显卡系列”。 但是,这并不是告诉我确切的卡,例如英特尔高清显卡家族有一个4200,4400,等等(从我的理解)。 我search了更多的方法来find这些信息,甚至通过registry,仍然使我的描述string“英特尔(R)高清显卡家庭”…现在我在这里。 非常感谢任何能帮助我的人,这实际上是一个stackoverflow线程,导致我在EnumDisplayDevices的方向在第一:)

D-Bus相当于Windows

任何人都知道Linux / D-Bus的Windows机制? 谢谢

我怎样才能从一个单独的线程处理窗口消息?

我希望启动一个单独的线程来处理窗口消息(通过阻塞的GetMessage循环),但是仍然在初始线程中创build窗口。 在单独的线程中,只要它启动,我就用PM_NOREMOVE调用PeekMessage来确保消息队列的存在(是否有必要?),然后.. AttachThreadInput(initial thread id,GetCurrentThreadId(),true) ..最后进入消息循环 我还没有使用互斥体或cs来确保这是及时发生的,但是为了简单起见,我仅仅在最初的线程中使用了一个Sleep语句。 无论如何,窗口消息似乎不被单独的线程拦截。 我有些不确定我是否正确地做了这件事,并且希望得到任何可能的指导。 两个线程都在同一个进程中 谢谢你们

有没有API来启用/禁用Windows 8.1上的蓝牙?

在Windows 8 / 8.1中,现在可以通过操作系统本身启用/禁用蓝牙(参见下图)。 这是真棒,因为它是设备/驱动程序不可知的。 在Android上,这可以通过BluetoothAdapter.enable()和BluetoothAdapter.disable()来实现 ,但是我一直没能在Windows上find任何可以做到这一点的东西(尽pipe看起来确实是这样)。 所以我试过使用: BluetoothEnableIncomingConnections() – 但是,这只能阻止新的传入连接。 它不禁用现有的。 devcon.exe – 这个方法的问题是A.它是一个不可再分发的二进制B.它要求你提前知道他的设备ID(所以它不是设备/驱动程序不可知的)。 另外,虽然它不是一个破坏者,它不会需要提升。 UI自动化 – 简单地启动PC设置应用程序,并通过键盘事件来切换开关很容易,但是在适当的编码实践和用户体验方面,这是非常难看的。 这就是说,这是我发现实现我到目前为止的行为的唯一途径。 我正在用C ++编写一个原生的Win32应用程序,所以我不受限于任何Windows应用程序的应用程序需求,但是,如果有一个不需要提升的方法,那将是非常好的。 TL; DR 是否有任何API,WMI接口或其他任何可用的function来实现function上等效的结果来翻转蓝牙拨动开关? 如果没有,有没有其他方法可以产生类似的结果?