我有两个用C编写的简单程序同时运行.第一个程序有一个图形用户界面窗口,而第二个程序没有窗口(隐藏).

第一个程序(图形用户界面)向第二个程序(隐藏)发送一个TCP命令,第二个程序使用Win32 API GetOpenFileNameA()打开一个文件对话.问题是该文件对话框显示在图形用户界面窗口后面.

Question:

How do I run 100 and force focus on it?

OPENFILENAMEA ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFile = FILE_PATH;
ofn.nMaxFile = sizeof(FILE_PATH);
ofn.lpstrFilter = "All Files\0*.*\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

if (GetOpenFileNameA(&ofn)) {
    return FILE_PATH;
}

推荐答案

您可能可以通过为打算发送给对话框的消息提供回调函数来强制它:

UINT_PTR OFNHookProcOldStyle(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
    BringWindowToTop(hdlg); // or SetWindowPos 
    return 0;
}

然后设置

ofn.lpfnHook = OFNHookProcOldStyle;

在打GetOpenFileNameA之前.

注意:这不会更改前景窗口或强制将焦点放在对话框上,但可能足以将其隐藏起来,使其显示在图形用户界面窗口的顶部.


在Windows 11中,必须为要调用的钩子程序指定标志OFN_ENABLEHOOK.这可能也是W11之前的一项要求,但无论如何它似乎奏效了.单独设置该标志会使其显示一个老式的对话框--但添加OFN_EXPLORER标志并定义钩子函数似乎是可行的,如下所示:

UINT_PTR Lpofnhookproc(HWND hdlgChild, UINT uiMsg, WPARAM wParam, LPARAM lParam) {
    if (uiMsg == WM_INITDIALOG) {
        BringWindowToTop(GetParent(hdlgChild)); // I think GetParent is needed
    }
    return 0;
}

// and then:
ofn.lpfnHook = Lpofnhookproc;

然而,这个对话框并不完全是没有钩子的默认对话框,我不知道如何设置它.可以为对话框指定模板,但我没有成功地获得与默认模板相同的外观.

ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLEHOOK;

或许可以通过确定将lpTemplateName指定为什么来修复对话框的外观:

ofn.lpTemplateName = MAKEINTRESOURCEA( ? ); // unsure about this one

在旗帜上再加OFN_ENABLETEMPLATE | OFN_ENABLETEMPLATEHANDLE个.

C++相关问答推荐

Mise()在虚拟内存中做什么?

不同到达时间的轮询实现

C编译器是否遵循restrict的正式定义?

这是一个合法的C Strdup函数吗?

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

自定义变参数函数的C预处置宏和警告 suppress ?

在为hashmap创建加载器时,我的存储桶指向它自己

如何使解释器存储变量

在每种If-Else情况下执行语句的最佳方式

如何计算打印二叉搜索树时每行所需的空间?

如何在提取的索引中分配空值?

C语言中奇怪的输出打印数组

为什么Linux无法映射这个PT_LOAD ELF段?

计算SIZE_MAX元素的长数组的大小

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

程序对大输入给出错误答案

使用 strtok 多次分割一个字符串会导致意外行为

函数指针作为函数参数 - 应该使用 const 吗?

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

C Makefile - 如何避免重复提及文件名