Articles of winapi

最小化/恢复窗口以编程方式跳过animation效果

我需要在窗口列表上执行多个操作(最小化其中的一些,还原其他窗口),以便一次切换两个或多个窗口。 这个问题是在最小化和恢复窗口时可以看到的那些animation。 整个过程看起来很糟糕,所有的animation进出,上下。 但是,我不能禁用这些animation,因为这是用于其他计算机的,我不想更改其他人的设置,而且当您最小化/恢复一个窗口(即手动执行)时,这些animation实际上是有用的,因为您可以看到发生了什么事情,但是一次只能在几个窗口上编程,这并不好。 我现在正在使用SendMessage函数发送WM_SYSCOMMAND消息与参数SC_MINIMIZE / SC_RESTORE 。 我不知道是否有另一种方式。 所以,这个问题: 我如何在没有animation效果的情况下以编程方式最小化/恢复窗口? PS:编程语言并不重要。 我可以使用任何语言来完成这个任务。

从主function最大化窗口?

我已经使用了一个互斥体来运行一个单一的实例程序,现在我希望窗口变得最大化,如果当用户重新打开应用程序时,这个窗口最小化。 这是我目前在我的Program.cs文件中的代码: static class Program { [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { bool Ok = true; string ProductName = Application.ProductName; Mutex m = new Mutex(true, ProductName, out Ok); if (!Ok) { System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName(ProductName); SetForegroundWindow(p[0].MainWindowHandle); } […]

如何使用SleepEx的可靠警报和整体最低睡眠时间?

我有以下用例:我当前的线程需要执行operation1 ,等待一些时间与其他人协调,然后需要做operation2 。 在等待之间,由于文件系统事件,APC可能需要由该线程处理,在当前线程完成operation2之后,APC将稍后向另一个队列添加另一个operation1 。 简单的如下: while (true) { processOperation1; SleepEx(…, true); processOperation2; } 重要的是,在operation1和operation2之间,必须至less经过指定的SleepEx时间! 这不需要是一个整体,线程可以立即用于处理APC并排队另一个operation1 ,除非指定的时间已过,否则它不应该继续operation2 。 从文档 : 如果参数为TRUE,并且调用此函数的线程与调用扩展I / O函数(ReadFileEx或WriteFileEx)的线程相同,则函数在超时时间已过或I / O完成callbackfunction发生。 如果发生I / O完成callback,则调用I / O完成function。 如果一个APC排队到该线程(QueueUserAPC),则该函数在定时器溢出时间已过或调用APC函数时返回。 根据我的理解,这意味着如果SleepEx被调用并且APC已经排队,那么直接由当前线程执行,因为它有这个能力。 但是之后SleepEx之后的代码会发生什么? 线程是否返回到进程operation2是因为SleepEx返回了控制权还是线程回到睡眠状态,在SleepEx停留,直到经过指定的时间量? 文档中的第一句话并不是说从函数返回,而是“恢复线程”: 挂起当前线程直到满足指定的条件。 发生以下情况之一时,执行继续: 这可能意味着线程恢复,处理APC,然后停留在SleepEx ,hibernate所需的任何时间量。 如果情况并非如此,那么SleepEx是否真的离开了,这是否说明已经过了多长时间? SleepEx似乎没有提供该值,但只有一些不变的返回值。 这听起来像我需要在我自己的SleepEx之前和之后需要时间,并一次又一次地调用该函数,直到我真正需要的时间已经过去? 有没有像这样的东西,也许是作为boost一部分? 谢谢!

如果不重置剪贴板链,可以中止一个进程吗?

我有一个程序在启动时调用SetClipboardViewer来注册剪贴板更改通知。 在关机时,它会调用ChangeClipboardChain从链中正确地移除它自己。 只要程序正常运行,这一切都很棒。 但是,这让我想知道,如果程序被终止,或者我在debugging器下杀死它,崩溃,或者由于用户因为出错而杀了进程,会发生什么? 那么清理就不会发生。 能以某种方式给系统造成麻烦吗? 具体来说,我知道Windows可以毫无困难地删除我的查看器,因为它是一个句柄,当进程终止时,Windows可以清理所有的句柄,但是这会导致链中的下一个值,我持有一个引用,迷路不知何故?

如何获取ShellNew子菜单项

我正在处理一个应用程序,我需要显示“新build”上下文菜单的子菜单。 即当我们右键单击桌面上,我们得到新的上下文菜单项,点击新的,我们得到“文件夹”,“快捷方式”,“文本文件”等。 我的问题是 – 是否有任何API获取列表新的子菜单? 也有任何API来获得“发送到”的子菜单?

卸载软件

我的产品有一个助手可执行文件来卸载所有相关的子产品。 我根据所有子产品的升级代码卸载。 首先,我使用MsiEnumRelatedProducts函数从升级代码中获取产品代码。 然后我尝试使用MsiConfigureProductEx函数卸载产品。 问题是MsiConfigureProductEx正在返回错误。 调用函数:MsiConfigureProductsEx 返回代码:1605(0x00000645) 说明:此操作仅对当前安装的产品有效。 为什么MsiEnumRelatedProducts返回无效的产品代码? 我通过Windowsregistrysearch,看看是否存在这样的产品代码。 没有任何 如何debugging该问题? 编辑:添加了重现问题的最小代码。 // UpgradeCodes is an array having upgrade codes of all modules. TCHAR lpProductCode[GUID_STR_LENGTH]; const TCHAR tszNoReboot[] = _T("REMOVE=ALL REBOOT=ReallySuppress DISABLE_REBOOT_PROMPT=1"); for (size_t i = 0; i < sizeof(UpgradeCodes) / sizeof(UpgradeCodes[0]); i++) { tstring tstrUpgradeCode = UpgradeCodes[i]; DWORD dwIndex = 0; size_t status; […]

如何使用GetWindowRect

考虑下面的代码: LPRECT lpRect; lpRect = malloc(sizeof(LPRECT)); GetWindowRect(hwnd, lpRect); 我不知道如何从lpRect获取信息; 请指教。

如何获得EFI系统分区的卷名?

我有一个Windows机器与GPT驱动器。 我有一个EFI系统分区的DOS设备名称作为bcdedit的输出。 我想打开这个分区的句柄,并通过QueryDosDevice()获得DOS名称来与我已经拥有的DOS名称进行比较。 我试图使用FindFirstVolume / FindNextVolume查找卷名以从QueryDosDevice获取DOS名称,但是我没有findEFI系统分区的卷。 WMI也没有这个分区的卷。 如何从C ++代码获取EFI系统分区的卷名以在QueryDosDevice中使用它?

使用C#禁用Windows的animation效果

我试图禁用窗口中的“褪色”animation,每当你打开或最大化/最小化窗口时发生。 当然,这可以通过在最小化和最大化时取消animation窗口的checkbox来手动完成 我试图通过SystemParametersInfo这是我的电话: [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SystemParametersInfo(uint uiAction, uint uiParam, bool pvParam,uint fWinIni); private static UInt32 SPIF_SENDCHANGE = 0x02; private static UInt32 SPI_SETUIEFFECTS = 0x103F; public static void Main() { bool res= SystemParametersInfo(SPI_SETUIEFFECTS, 0, false, SPIF_SENDCHANGE); } result值总是为True ,所以我知道函数调用成功。 但我看不到任何结果… Windows仍然保持animation我调整任何窗口。 我编译为AnyCPU,作为pipe理员在Windows 10上运行。 对于@cody灰色这是代码(将ref关键字添加到ai参数,并将Marshal.Sizeof(ai)转换为uint)。 [StructLayout(LayoutKind.Sequential)] public struct ANIMATIONINFO { […]

如何在运行时加载PathCchCanonicalizeEx?

我正在尝试使用PathCchCanonicalizeEx API,但也使得我的应用程序在Windows 8之前的操作系统上可用。所以我想使用LoadLibrary加载它,但我似乎无法弄清楚它是什么库?