Articles of winapi

将窗口焦点恢复到之前的所有者

我有一个应用程序,位于系统托盘,当双击打开一个窗口,相当标准; 然而,当你关上窗户时,我希望窗户在我被打开之前被重点聚焦。 如果通过键盘快捷键popup我的窗口,我可以在窗口显示前使用GetForegroundWindow API调用,然后在窗口closures后使用SetForegroundWindow方法(使用第一个调用的值)恢复重点。 当您通过系统托盘打开窗口时,这不起作用,因为用户本质上已经使系统托盘成为焦点。 我已经尝试使用GetForegroundWindow , GetWindow和GetTopMostWindow的组合来尝试导航z顺序来查找系统托盘之后的第二个窗口(假设系统托盘已经跳到顶部,因此在逻辑上下一个将是原来的前面)。 虽然我没有取得任何成就,但是这些function的结果是无用的,因为它们似乎没有给我任何逻辑结构。 有没有人有任何想法,我怎么能做到这一点? 我曾经想过某种背景监视器,它只是坐在监视器前面的窗口并存储一个指针,但最好是片状的。 这是在Windows(我个人在x64 Server 2008)和.Net 3.5。

使用FindVCLWindow在Delphi中调用WinHelp32(WinXP Pro SP3 32bit)

那里有什么问题? procedure TForm1.VCLHelpClick(Sender: TObject); var Ctrl : TWinControl; begin Ctrl := FindVCLWindow(Mouse.CursorPos); if Ctrl <> nil then if Form2.Cursor = crHelp then begin if Ctrl = CreatorEdit then Application.HelpCommand(HELP_CONTEXT,001); if Ctrl = EditorEdit then Application.HelpCommand(HELP_CONTEXT,002); if Ctrl = UpdaterEdit then Application.HelpCommand(HELP_CONTEXT,003); if Ctrl = IdeaEdit then Application.HelpCommand(HELP_CONTEXT,004); if Ctrl = PorterEdit then Application.HelpCommand(HELP_CONTEXT,005); end; end; […]

如何使用IDispatch.Invoke调用接收浮点值的函数?

我无法使用IDispatch.Invoke调用具有浮点参数和浮点结果的函数。 这是一个最小的复制: #include <atlbase.h> #include <comutil.h> int main(int argc, char* argv[]) { CoInitialize(NULL); CComPtr<IDispatch> wordapp; if (SUCCEEDED(wordapp.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER))) { CComVariant result; CComVariant centimeters((float)2.0); CComVariant retval = wordapp.Invoke1(L"CentimetersToPoints", &centimeters, &result); } return 0; } 我正在使用ATL CComPtr使事情更清洁。 但是这是IDispatch.Invoke的一个非常宽松的包装。 当我运行这个,调用Invoke1失败并返回E_FAIL 。 我怀疑这个问题与使用浮点参数和/或返回值有关。 如果我调用一个不使用这些值的函数,调用将成功: CComVariant retval = wordapp.Invoke0(L"ProductCode", &result); 我注意到,如果我从VBS或从PowerShell调用函数,它会成功。 我假设他们都使用迟来的IDispatch ,所以这将表明,我正在尝试是至less有可能的。 那么,如何使用IDispatch来调用这个函数呢?

如何让屏幕在Windows中缩放?

我正在写一个Windows程序,让用户切换1920×1080和3840×2160之间的分辨率,这意味着在FHD和4K之间。 我试图使用“GetSystemMetrics”来获得当前的解决scheme。 //Algorithm #1 //Get current resolution and resolution scaling. xScreenResolution = GetSystemMetrics(SM_CXSCREEN); yScreenResolution = GetSystemMetrics(SM_CYSCREEN); cout << "Current Resolution is: " << xScreenResolution << "x" << yScreenResolution << endl; 例如,如果我使用3840 * 2160的分辨率,我预计程序会给我3840 * 2160的分辨率。 但是,该程序只输出1536×864,这是Windows执行重新缩放后的分辨率。 所以我想知道如何获得比例因子(100%,200%,250%等),如Windows 10中的显示设置 。Windows 10中的显示设置

我怎样才能使一个subprocess窗口在我的过程中出现模态?

我有一个应用程序调用其他实用程序应用程序来为特定设备设置一些设置。 该实用程序应用程序使用ShellExecuteEx进行调用。 为了不使用户混淆,最好将实用程序模式窗口设置为我的主窗口。 如何做到这一点? 我试过的东西: WaitForSingleObjectEx在ShellExecuteEx之后的进程中,INFINITE TIMEOUT – 窗口是模态的,但主应用程序不重画(因为它正在等待单个对象!) WaitForSingleObjectEx在ShellExecuteEx之后的过程中,有一些小超时,然后调用PeekMessage和DispatchMessage – repaint现在可以工作,但是实用程序应用程序不再是“模态”的。 主应用程序响应鼠标点击,button点击等 EnableWindow(FALSE),然后执行方法#2,然后EnableWindow(TRUE) – WORKS !!!,但是在此之后,我的应用程序的z顺序改变了。 (现在在其他窗口下面)。 为什么?!

如何在Windows上限制进程的CPU使用率? (需要代码,而不是应用程序)

有一些程序能够限制Windows中进程的CPU使用率。 例如BES和ThreadMaster 。 我需要编写自己的程序来完成与这些程序相同的function,但具有不同的configurationfunction。 有谁知道一个进程的CPU节stream是如何完成的(代码)? 我不是在谈论设置进程的优先级,而是如何将CPU使用率限制在例如15%,即使没有其他进程争夺CPU时间。 更新:我需要能够扼杀已经运行的任何进程,并且我没有源代码访问权限。

GetDC()和BeginPaint()之间的区别

我正在使用Win32 UI。 我想知道GetDC和BeginPaint之间的区别。 何时使用哪个API以及何时不使用哪个API。

有没有办法在文件系统上伪造文件或写一个文件只能看到我的EXE文件

好吧,我写和使用Adobe ActiveX控件来显示PDF文件的应用程序。 Adobe ActiveX控件仅从文件系统加载文件。 所以我只需要提供一个文件path到这个控制。 问题是我不想将PDF文件存储在文件系统上。 活动临时! 我不想将我的PDF文件只存储在内存中 ,我想使用Adobe ActiveX控件。 所以我nead: 1)在文件系统上伪造文件的一种方法。 所以这个控件会“认为”有一个文件,但会从内存中加载它 2)在文件系统上创build文件的方法,只有一个应用程序“可见”,所以我的PDF控件可以加载它,其他用户甚至不会看到它。 3)别的东西 PS:我不是要“完成我的家庭工作”,我只是问 – 有没有办法做到这一点?

是否有可能跟踪进程之间的PostMessage?

我们有一个系统,通常有两个进程在同一个系统上运行。 一个进程处理的GUI和其他运行像服务(虽然由于历史原因,这不是一个服务,只是一个exe没有可见的窗口)。 这两个进程主要通过注册消息asynchronous进行IPC – 即我们在两个进程中使用RegisterWindowMessage()来定义一组大量消息,这些消息有效地形成了API到服务器进程。 我编写了一个“免提”监视应用程序,使用SetWindowsHookEx()来监视和显示两个进程的消息队列,并提供API的使用方式以及如何将通知传播到GUI进程的某种级别的解码(每个窗口可以直接订阅来自服务器的通知)。 所以,在两个方向都有大量的消息,所以我有过滤和总结计数等,所以我可以专注于特定的活动。 所有这些都可以在不影响实时代码的情况下完成,这很好。 这一切运行良好,但是现在能够“标记”源自GUI的消息是非常有用的,所以我可以在服务器处理它时跟踪相同的消息。 这对于debugging和诊断系统问题将是非常有用的,但是我不能find一个干净的方式(实际上我找不到任何方法!),而不用为我们的注册消息API添加这样的支持,这将是很多而且涉及到的风险远远超过了我现在所熟悉的风险。 由于服务器预先处理了一些消息,然后执行PostMessage()来执行操作,所以原始消息可能会“丢失”,这变得更加复杂了。 有没有人在这里解决这类问题? 如果是这样,你可以给我一些指针? 如果没有,那么是否有任何logging或没有logging的方法来将一小块数据添加到Windows消息并稍后检索? 我看了SetMessageExtraInfo()但似乎是每队列,而不是每个消息。

ULARGE_INTEGER联盟的要点是什么?

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742%28v=vs.85%29.aspx 它们应该像这样使用,在LowPart和HighPart上设置两个32位值,然后在QuadPart上执行算术运算。 int a,b,c; ULARGE_INTEGER u; … u.LowPart = a; u.HighPart = b; u.QuadPart += c; 所以如果你打算在QuadPart(64位)上执行算术,那么你需要一个64位的处理器,对吧? 那么整个问题是什么呢? 为什么不直接将值分配给QuadPart?