我正在尝试使用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)
此代码有效,我的窗口出现在另一个应用程序中,但引入了以下问题:
有人知道解决方法吗?我希望我的窗口被视为主应用程序的另一个子窗口.
在我的应用程序中,我可以通过编程方式打开资源管理器并使用以下代码选择文件:
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如何实现这一点,我很想知道它.
我使用原生win32 API编写了一个Windows应用程序.我的应用程序将启动其他进程并捕获输出并以红色突出显示stderr输出.
为了实现这一点,我为stdout和stderr创建了一个单独的管道,并在调用CreateProcess时在STARTUPINFO结构中使用它们.然后,我为每个stdout/stderr句柄启动一个单独的线程,该句柄从管道读取并将输出记录到窗口.
在大多数情况下,这样做很好.我遇到的问题是,如果子进程快速连续记录到stderr和stdout,我的应用程序有时会以错误的顺序显示输出.我假设这是由于使用两个线程从每个句柄读取.
是否有可能以写入的原始顺序捕获stdout和stderr,同时能够区分这两者?
我有一个字符串宏,如下所示:
#define APPNAME "MyApp"
Run Code Online (Sandbox Code Playgroud)
现在我想通过执行以下操作来构造一个使用此宏的宽字符串:
const wchar_t *AppProgID = APPNAME L".Document";
Run Code Online (Sandbox Code Playgroud)
但是,这会生成"连接不匹配的字符串"编译错误.
有没有办法将APPNAME宏转换为宽字符串文字?
c ×2
c++ ×2
winapi ×2
explorer ×1
redirect ×1
shellexecute ×1
stderr ×1
stdout ×1
widestring ×1
windows ×1