Articles of winapi

如何在Java应用程序中预览任何文件?

我正在使用JTree来浏览文件夹的内容,我希望当用户点击一个文件时,软件会显示它的预览(第一页的屏幕截图)。 这些文件大多是Office文档和PDF。 我使用从Sun下载的模块pipe理PDF文件,但是我想知道是否有办法使用任何软件(最好是JAR)甚至是内置的Windows API。 我正在考虑将文件转换为PDF然后做这个PDF的预览,但这不是最佳的。 有任何想法吗 ?

消息队列在Win32中如何工作?

我在Win32上读了一些东西以及消息循环是如何工作的,还有一些东西还不清楚:什么存储在消息队列中? 与消息( WM_COMMAND , WM_CREATE等)相对应的整数值,还是指向包含消息整数值和其他东西(如wParam , lParam等)的MSG结构的指针?

Win32用户模拟好奇心

我在codeproject上find了一些允许用户模拟的示例代码。 此代码通过导入以下非托pipe的Win32 API函数: [DllImport("advapi32.dll", SetLastError = true)] private static extern int LogonUser( string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int DuplicateToken(IntPtr hToken,int impersonationLevel,ref IntPtr hNewToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool RevertToSelf(); [DllImport("kernel32.dll", CharSet […]

Windows 7左键单击时钟popup

当在Windows 7的任务栏上单击时钟(也许是Vista)时,会popup一个popup窗口,显示日历和时钟(因此不是date和时间调整窗口)。 我如何打开这个窗口(首选在C#中)? 我希望timedate.cpl会调用这个,但是这会打开date和时间调整窗口。

最小化/恢复窗口以编程方式跳过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; […]