小编fla*_*shk的帖子

使用SetParent将HWND嵌入到外部进程中

我正在尝试使用SetParent函数将我的进程中的窗口嵌入到外部进程的窗口中,并且遇到了一些我希望有人可以帮助我的问题.首先,这里是我正在做的将窗口嵌入应用程序的大纲:

HWND myWindow; //Handle to my application window
HWND externalWindow; //Handle to external application window

SetParent(myWindow,externalWindow);

//Remove WS_POPUP style and add WS_CHILD style
DWORD style = GetWindowLong(myWindow,GWL_STYLE);
style = style & ~(WS_POPUP);
style = style | WS_CHILD;
SetWindowLong(myWindow,GWL_STYLE,style);
Run Code Online (Sandbox Code Playgroud)

此代码有效,我的窗口出现在另一个应用程序中,但引入了以下问题:

  • 当我的窗口获得输入焦点时,外部进程的主应用程序窗口失去焦点(即标题栏改变颜色)
  • 当我的窗口具有焦点时,主应用程序的键盘快捷键命令不起作用

有人知道解决方法吗?我希望我的窗口被视为主应用程序的另一个子窗口.

c winapi

17
推荐指数
1
解决办法
7743
查看次数

以编程方式在资源管理器中选择文件

在我的应用程序中,我可以通过编程方式打开资源管理器并使用以下代码选择文件:

void BrowseToFile(LPCTSTR filename)
{
    CString strArgs; 
    strArgs = _T("/select,\"");
    strArgs += filename; 
    strArgs += _T("\"");

    ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我第二次使用不同的文件调用此函数,但在同一文件夹中,资源管理器中的选择不会更改为新文件,而是保留在以前的文件中.

例如,如果我调用我的函数C:\path\to\file1.txt,将打开一个新的资源管理器窗口file1.txt并将被选中.如果我第二次调用我的函数C:\path\to\file2.txt,将激活现有的资源管理器窗口,但选择仍将打开file1.txt.

有没有办法强制资源管理器更新选择或更好的方法来实现这一目标?

编辑:

上面提到的行为是在Windows XP上.似乎Vista/Win7上的行为是不同的.每次调用都会打开一个新的资源管理器实例并选择该文件.

我的主要目标是将Visual Studio选项复制到文档的Open Containing Folder.Visual Studio中的此功能在XP,Vista和Win7上的行为相同.如果具有相同文件夹的另一个实例已打开,则不会创建新实例,但会将选择更新为新文件.

如果有人知道Visual Studio如何实现这一点,我很想知道它.

c++ windows explorer shellexecute

17
推荐指数
1
解决办法
1万
查看次数

我可以单独捕获stdout/stderr并保持原始顺序吗?

我使用原生win32 API编写了一个Windows应用程序.我的应用程序将启动其他进程并捕获输出并以红色突出显示stderr输出.

为了实现这一点,我为stdout和stderr创建了一个单独的管道,并在调用CreateProcess时在STARTUPINFO结构中使用它们.然后,我为每个stdout/stderr句柄启动一个单独的线程,该句柄从管道读取并将输出记录到窗口.

在大多数情况下,这样做很好.我遇到的问题是,如果子进程快速连续记录到stderr和stdout,我的应用程序有时会以错误的顺序显示输出.我假设这是由于使用两个线程从每个句柄读取.

是否有可能以写入的原始顺序捕获stdout和stderr,同时能够区分这两者?

winapi redirect stdout stderr

8
推荐指数
1
解决办法
1716
查看次数

将宽字符串文字与字符串宏组合在一起

我有一个字符串宏,如下所示:

#define APPNAME "MyApp"
Run Code Online (Sandbox Code Playgroud)

现在我想通过执行以下操作来构造一个使用此宏的宽字符串:

const wchar_t *AppProgID = APPNAME L".Document";
Run Code Online (Sandbox Code Playgroud)

但是,这会生成"连接不匹配的字符串"编译错误.

有没有办法将APPNAME宏转换为宽字符串文字?

c c++ widestring c-preprocessor

4
推荐指数
1
解决办法
4244
查看次数