Shell 执行将窗口置于前面

2024-05-03

我正在使用此函数从我的 MSI 调用可执行文件。然而,可执行文件的窗口隐藏在我的 MSI 窗口后面。有什么办法可以把它带到前面吗?

我尝试在调用之前最小化所有窗口ShellExecute但这仍然没有将可执行窗口带到前面。

extern "C" UINT __stdcall InstallDrivers(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
HANDLE hFile = INVALID_HANDLE_VALUE;
BYTE* pbData = NULL;
DWORD cbData = 0;
char pwzFilename[MAX_PATH], szDriverType[MAX_PATH], pwzSentinelFilename[MAX_PATH], szIsInstalled[MAX_PATH];
LPWSTR szValueBuf = NULL, szIsHaspInstalled = NULL, szIsSentinelInstalled = NULL;

hr = WcaInitialize(hInstall, "InstallDrivers");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");
WcaLog(LOGMSG_STANDARD, "%s", szValueBuf);
CreateDirectory("C:\\Temp", NULL);

strcpy_s(pwzFilename, "C:\\Temp\\HASPUserSetup.exe");

hr = ExtractBinary(L"Hasp", &pbData, &cbData);
ExitOnFailure(hr, "failed to extract binary data");

if ((hFile = CreateFile(pwzFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) 
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;  
} 

DWORD cbWritten = 0;
if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) )
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not write to file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;
}

CloseHandle(hFile);

strcpy_s(pwzSentinelFilename, "C:\\Temp\\sentinel_setup.exe");
hr = ExtractBinary(L"Sentinel", &pbData, &cbData);
ExitOnFailure(hr, "failed to extract binary data");

if ((hFile = CreateFile(pwzSentinelFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) 
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;  
} 


if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) )
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not write to file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;
}

CloseHandle(hFile);

hr = WcaGetProperty(L"DRIVER", &szValueBuf);
ExitOnFailure(hr, "failed to get driver info");

wcstombs(szDriverType, szValueBuf, 260);
if (strcmp(szDriverType, "Hasp") == 0)
{   

    hr = WcaGetProperty(L"SENTINELINSTALLED", &szIsSentinelInstalled);
    ExitOnFailure(hr, "failed to get driver info");
    wcstombs(szIsInstalled, szValueBuf, 260);
    if (strcmp(szIsInstalled, "Sentinel Protection Installer 7.6.5") == 0)
    {
    ShellExecute(NULL, "open",  pwzSentinelFilename, NULL, NULL, SW_SHOWNORMAL);
    }
    ShellExecute(NULL, "open",  pwzFilename, NULL, NULL, SW_SHOWNORMAL);
}else
{
    hr = WcaGetProperty(L"HASPINSTALLED", &szIsHaspInstalled);
    ExitOnFailure(hr, "failed to get driver info");
    wcstombs(szIsInstalled, szIsHaspInstalled, 260);
    if (strcmp(szIsInstalled, "Sentinel Runtime") == 0)
    {
    ShellExecute(NULL, "open",  pwzFilename, NULL, NULL, SW_SHOWNORMAL);
    }
    ShellExecute(NULL, "open",  pwzSentinelFilename, NULL, NULL, SW_SHOWNORMAL);
}
LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

更新的代码:

extern "C" UINT __stdcall InstallDrivers(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
HANDLE hFile = INVALID_HANDLE_VALUE;
BYTE* pbData = NULL;
DWORD cbData = 0;
char pwzFilename[MAX_PATH], szDriverType[MAX_PATH], pwzSentinelFilename[MAX_PATH], szIsInstalled[MAX_PATH];
LPWSTR szValueBuf = NULL, szIsHaspInstalled = NULL, szIsSentinelInstalled = NULL;
SHELLEXECUTEINFO ShExecInfo;

ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWNORMAL;
ShExecInfo.hInstApp = NULL;

hr = WcaInitialize(hInstall, "InstallDrivers");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");
WcaLog(LOGMSG_STANDARD, "%s", szValueBuf);
CreateDirectory("C:\\Temp", NULL);

strcpy_s(pwzFilename, "C:\\Temp\\HASPUserSetup.exe");

hr = ExtractBinary(L"Hasp", &pbData, &cbData);
ExitOnFailure(hr, "failed to extract binary data");

if ((hFile = CreateFile(pwzFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) 
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;  
} 

DWORD cbWritten = 0;
if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) )
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not write to file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;
}

CloseHandle(hFile);

strcpy_s(pwzSentinelFilename, "C:\\Temp\\sentinel_setup.exe");
hr = ExtractBinary(L"Sentinel", &pbData, &cbData);
ExitOnFailure(hr, "failed to extract binary data");

if ((hFile = CreateFile(pwzSentinelFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) 
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;  
} 


if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) )
{
    PMSIHANDLE hRecord = MsiCreateRecord(0);
    MsiRecordSetString(hRecord, 0, TEXT("Could not write to file"));
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
    return ERROR_INSTALL_USEREXIT;
}

CloseHandle(hFile);

hr = WcaGetProperty(L"DRIVER", &szValueBuf);
ExitOnFailure(hr, "failed to get driver info");

wcstombs(szDriverType, szValueBuf, 260);
if (strcmp(szDriverType, "Hasp") == 0)
{   

    hr = WcaGetProperty(L"SENTINELINSTALLED", &szIsSentinelInstalled);
    ExitOnFailure(hr, "failed to get driver info");
    wcstombs(szIsInstalled, szValueBuf, 260);
    if (strcmp(szIsInstalled, "Sentinel Protection Installer 7.6.5") == 0)
    {
        AllowSetForegroundWindow(ASFW_ANY);
        ShExecInfo.lpFile = pwzSentinelFilename;
        ShellExecuteEx(&ShExecInfo);
        /*ShellExecute(NULL, "open",  pwzSentinelFilename, NULL, NULL, SW_SHOWNORMAL);*/
    }
    AllowSetForegroundWindow(ASFW_ANY);
    ShExecInfo.lpFile = pwzFilename;
    ShellExecuteEx(&ShExecInfo);

    /*ShellExecute(NULL, "open",  pwzFilename, NULL, NULL, SW_SHOWNORMAL);*/
}else
{
    hr = WcaGetProperty(L"HASPINSTALLED", &szIsHaspInstalled);
    ExitOnFailure(hr, "failed to get driver info");
    wcstombs(szIsInstalled, szIsHaspInstalled, 260);
    if (strcmp(szIsInstalled, "Sentinel Runtime") == 0)
    {
        AllowSetForegroundWindow(ASFW_ANY);
        /*ShellExecute(NULL, "open",  pwzFilename, NULL, NULL, SW_SHOWNORMAL);*/
        ShExecInfo.lpFile = pwzFilename;
        ShellExecuteEx(&ShExecInfo);
    }
    AllowSetForegroundWindow(ASFW_ANY);
    ShExecInfo.lpFile = pwzSentinelFilename;
    ShellExecuteEx(&ShExecInfo);
    /*  ShellExecute(NULL, "open",  pwzSentinelFilename, NULL, NULL, SW_SHOWNORMAL);*/
}
LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

Windows 不允许进程抢占前台窗口,除非用户启动它们。这是为了避免诸如说服用户在错误的窗口中输入银行详细信息之类的情况。然而,当前的前台进程可以将权限传递给另一个进程来执行此操作。看允许设置前景窗口 http://msdn.microsoft.com/en-us/library/windows/desktop/ms632668%28v=vs.85%29.aspx了解详情。为此,您必须提供将成为前台的进程的进程 ID,而 ShellExecute 不提供该进程 ID。但是,如果您切换到使用Shell执行Ex http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154%28v=vs.85%29.aspx您可以从 SHELLEXECUTEINFO 结构上的 hProcess 成员获取此信息。

然后你可以打电话设置前景窗口 http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539%28v=vs.85%29.aspx在您的新流程中,它将被允许。否则它只会开始在任务栏上闪烁。

EDIT

如果您的初始应用程序是前台应用程序,并且您从中启动一个子进程,则该子进程应自动成为前台,如这些函数的文档中所述。

下面是我们如何选择启用和设置另一个应用程序以成为前台窗口的示例。在本例中,它只是创建一个文本文件并使用以下命令调用 ShellExecuteExopen动词。我们必须等待子进程启动并准备好其窗口,然后我们可以从进程 ID 中找到该窗口并为其授予权限并将其窗口设置为前台。在这种情况下,启动的记事本(或 .txt 文件的“打开”动词)无论如何都将位于前台。如果您单独运行一个记事本进程并替换该进程的进程 ID(我们通常放入子进程 ID),那么我们可以another进程成为前台——它不是我们进程树的一部分。这可以使用 Visual C++ 进行编译cl -nologo -W3 -O2 -MD fg_test.cpp生成一个 fg_test.exe。

#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <shellapi.h>

#pragma comment(lib, "shell32")
#pragma comment(lib, "user32")

static void PrintError(LPCTSTR szPrefix, DWORD dwError);
static BOOL CALLBACK OnGetWindowByProcess(HWND hwnd, LPARAM lParam);

typedef struct {
    DWORD pid;
    HWND hwnd;
} WINDOWPROCESSINFO;

int _tmain(int argc, TCHAR *argv[])
{
    SHELLEXECUTEINFO sxi = {0};
    sxi.cbSize = sizeof(sxi);
    sxi.nShow = SW_SHOWNORMAL;

    FILE *fp = NULL;
    _tfopen_s(&fp, _T("junk.txt"), _T("wt"));
    _fputts(_T("Example text file\n"), fp);
    fclose(fp);

    sxi.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NOASYNC | SEE_MASK_WAITFORINPUTIDLE;
    sxi.lpVerb = _T("open");
    sxi.lpFile = _T("junk.txt");
    if (!ShellExecuteEx(&sxi))
        PrintError(_T("ShellExecuteEx"), GetLastError());
    else
    {
        WINDOWPROCESSINFO info;
        info.pid = GetProcessId(sxi.hProcess); // SPECIFY PID
        info.hwnd = 0;
        AllowSetForegroundWindow(info.pid);
        EnumWindows(OnGetWindowByProcess, (LPARAM)&info);
        if (info.hwnd != 0)
        {
            SetForegroundWindow(info.hwnd);
            SetActiveWindow(info.hwnd);
        }
        CloseHandle(sxi.hProcess);

    }
    return 0;
}

static BOOL CALLBACK OnGetWindowByProcess(HWND hwnd, LPARAM lParam)
{
    WINDOWPROCESSINFO *infoPtr = (WINDOWPROCESSINFO *)lParam;
    DWORD check = 0;
    BOOL br = TRUE;
    GetWindowThreadProcessId(hwnd, &check);
    _tprintf(_T("%x %x %x\n"), hwnd, check, infoPtr->pid);
    if (check == infoPtr->pid)
    {
        _tprintf(_T("found window %x for process id %x\n"), hwnd, check);
        infoPtr->hwnd = hwnd;
        br = FALSE;
    }
    return br;
}

static void
PrintError(LPCTSTR szPrefix, DWORD dwError)
{
    LPTSTR lpsz = NULL;
    DWORD cch = 0;

    cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
                        | FORMAT_MESSAGE_FROM_SYSTEM
                        | FORMAT_MESSAGE_IGNORE_INSERTS,
                        NULL, dwError, LANG_NEUTRAL, (LPTSTR)&lpsz, 0, NULL);
    if (cch < 1) {
        cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
                            | FORMAT_MESSAGE_FROM_STRING
                            | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                            _T("Code 0x%1!08x!"),
                            0, LANG_NEUTRAL, (LPTSTR)&lpsz, 0,
                            (va_list*)&dwError);
    }
    _ftprintf(stderr, _T("%s: %s"), szPrefix, lpsz);
    LocalFree((HLOCAL)lpsz);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell 执行将窗口置于前面 的相关文章

  • Windows 8 Metro 应用程序(网格应用程序)过渡时出现黑色闪烁

    我正在基于网格应用程序模板构建 Windows 8 Metro 应用程序 一切都很顺利 直到我尝试更改应用程序的主题和背景 我将图像背景应用于所有 3 个 XAML 页面的网格 另外 我在应用程序包清单中将主题更改为 Light 但它没有执
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • sqlite3-ruby gem:无法构建 gem 本机扩展

    Update 看看这个后续问题 Windows 上的 Gem 更新 它坏了吗 https stackoverflow com questions 134581 gem update on windows is it broken 在 Win

随机推荐

  • Razor 支持 lambda 表达式吗?

    Razor 视图引擎是否支持 lambda 表达式 匿名方法 我很难在 Razor 中表达以下内容 Model ToList ForEach i gt if i DealerName null
  • MVC模型未成功更新但找不到原因

    这让我抓狂 我不断收到以下异常 System InvalidOperationException Models Expense 类型的模型未成功更新 在System Web Mvc Controller UpdateModel TModel
  • iPhone:跟踪/识别个人触摸

    我有一个关于 iPhone 上跟踪触摸的快速问题 我似乎无法对此得出结论 因此非常感谢任何建议 想法 我希望能够跟踪和识别 iPhone 上的触摸 即 基本上每次触摸都有一个起始位置和当前 移动位置 触摸存储在 std vector 中 一
  • C# 编译器错误?为什么这个隐式用户定义转换无法编译?

    给定以下结构 public struct Foo
  • 获取:使用获取响应设置变量并从函数返回[重复]

    这个问题在这里已经有答案了 我对 JavaScript 和 React 还很陌生 我有一个来自组件的回调 该组件从给定 id 的服务器获取 customer name 提取工作正常 console log 正确打印全名 但最后一个 then
  • 在 JavaScript 中压缩 Blob

    我需要使用 ajax 向服务器发送一个 blob 但它最终可能会变得有点大 我想减少上传时间 我已经尝试过 jszip 但这只是在 zip 中给了我一个空文件 我也尝试过 btoa 但事实证明编码值最终只是 object Blob 而不是实
  • 使用存储桶级别权限调用 PutObject 操作时出现访问被拒绝的情况

    我按照上面的例子http docs aws amazon com IAM latest UserGuide access policies examples html iam policy example s3 http docs aws
  • 如何使 UL 元素内的列表项居中?

    如何在不使用额外的 div 或元素的情况下将列表项集中在 ul 内 我有以下内容 我想text align center就可以了 我似乎无法弄清楚 ul li test li li test li li test li li test li
  • 我应该使用哪种协议来传输音频(非直播)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 MySQL 5、简单成员资格提供程序、ASP.NET MVC4 和实体框架 5

    我在尝试着 使用 ASP NET MVC 4 对 MySQL 使用基于简单成员资格提供程序的身份验证默认 Web 应用程序配置为使用 MySQL 使用以下给出的教程 http www nsilverbullet net 2012 11 07
  • 仅复制对象一部分的优雅方法[重复]

    这个问题在这里已经有答案了 我想通过仅复制其中的一些属性来从更大的对象创建一个新对象 我所知道的所有解决方案都不是很优雅 我想知道是否有更好的选择 如果可能的话是原生的 没有像下面代码末尾那样的附加功能 这是我现在通常做的事情 I want
  • Swing 组件 - 禁用布局中的调整大小

    我有一个自定义 GUI 组件 它基于 Swing 的 JPanel 该组件放置在使用 BorderLayout 的 JFrame 中 当我调整框架大小时 该组件会不断调整大小 我怎样才能避免这种情况 我希望组件无论发生什么情况都保持相同的大
  • 将表情符号列表替换为其图像

    我有一个数组 emoticons smile1 gif smile2 gif D smile3 gif 然后我有一个带有文本的变量 var text this is a simple test 和一个带有网站 url 的变量 var url
  • 同位素网格+角印去除空白,排序逻辑

    这个问题与这个旧问题有关 同位素网格布局使用空白空间 https stackoverflow com questions 11612399 isotope grid layout use empty space 这是我正在使用的小提琴 ht
  • 如何使用过程填充数据库

    我有大约 15 个不同的表 其中填充了不同的数据和不同的实体关系 我需要创建一个脚本 用这些表的内容填充我的数据库 脚本完成后 我使用 sqlplus 在 cmd 中运行它 然后使用 START文件路径 我有两个不同的 sql 文件 一个名
  • Python C-Api 线程问题

    我正在编写一个 C 程序 它使用用 python 编写的网络库 我将 python lib 与 python C api 一起嵌入 该库异步发送所有请求 并在请求完成时通过信号通知我 这意味着理论上 实际上我有两个与线程相关的问题 从 c
  • 现代正则表达式引擎可以解析什么样的形式语言?

    人们有时会说 你不能用正则表达式解析 X 因为 X 不是正则语言 然而 根据我的理解 现代正则表达式引擎可以匹配的不仅仅是正则语言乔姆斯基的感觉 http en wikipedia org wiki Chomsky hierarchy 我的
  • Android:Google 登录令牌无效

    我通过 Android 中的 google 登录收到的令牌收到错误 error invalid token error description 无效值 我还注意到 与我在 iOS 中获得的令牌相比 我的令牌看起来有点短 ya29 4AFYx
  • Laravel 关注者/关注关系

    我正在尝试在 laravel 中制作一个简单的关注者 关注系统 没什么特别的 只需单击一个按钮即可关注或取消关注 并显示关注者或关注你的人 我的问题是我不知道如何建立模型之间的关系 这些是迁移 用户迁移 Schema create user
  • Shell 执行将窗口置于前面

    我正在使用此函数从我的 MSI 调用可执行文件 然而 可执行文件的窗口隐藏在我的 MSI 窗口后面 有什么办法可以把它带到前面吗 我尝试在调用之前最小化所有窗口ShellExecute但这仍然没有将可执行窗口带到前面 extern C UI