gpt4 book ai didi

winapi - 在 MS Windows(XP) 上使用来自不同进程的窗口句柄进行窗口操作

转载 作者:行者123 更新时间:2023-12-02 08:22:19 25 4
gpt4 key购买 nike

是否可以使用具有句柄的其他进程的窗口执行某些操作?我想做的是:- 去除 window 装饰- 将窗口移动到屏幕的任意位置-让窗口保持在顶部而不使其成为模态

指向命令行工具、脚本或 C/C++ 代码片段的链接非常好。

非常感谢!

最佳答案

我决定再试一次,因此我尝试了您的代码并添加了缺少的内容:-naked 选项。

去除装饰的 key came from here 。尽管它有效,但您最终会发现裸露的应用程序可能会开始显示一些错误。

享受:

#include "windows.h"
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <limits>

using namespace std;

#ifdef min
#undef min
#endif


int main(int argc, char* argv[])
{
char** param = argv;

unsigned int x = numeric_limits<int>::min(), y=numeric_limits<int>::min(), w=numeric_limits<int>::min(), h=numeric_limits<int>::min();
HWND z = HWND_NOTOPMOST;
unsigned int flags = (SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
++param;

wstring winTitle;
bool close = false;
bool naked = false;
while (*param)
{
string sparam(*param);
if (sparam == "-title")
{
++param;
if (!*param) break;

sparam = *param;
winTitle.resize(sparam.size());
copy(sparam.begin(), sparam.end(), winTitle.begin());
}
else if (sparam == "-move")
{
++param;
if (!*param) break;

sparam =*param;
stringstream sstr(sparam);
char sep;
sstr >> x >>sep >> y;
if (x != numeric_limits<int>::min() && y != numeric_limits<int>::min())
{
flags &= ~SWP_NOMOVE;
}
}
else if (sparam == "-resize")
{
++param;
if (!*param) break;

sparam = *param;
stringstream sstr(sparam);
char sep;
sstr >> w >>sep >> h;
if (h != numeric_limits<int>::min() && w != numeric_limits<int>::min() )
{
flags &= ~SWP_NOSIZE;
}
}
else if (sparam == "-top")
{
z = HWND_TOP;
flags &= ~SWP_NOZORDER;
}
else if (sparam == "-staytop")
{
z = HWND_TOPMOST;
flags &= ~SWP_NOZORDER;
}
else if (sparam == "-bottom")
{
z = HWND_BOTTOM;
flags &= ~SWP_NOZORDER;
}
else if (sparam == "-hide")
{
flags |= SWP_HIDEWINDOW;
}
else if (sparam == "-close")
{
close = true;
}
else if (sparam == "-naked")
{
naked = true;
}

++param;
}

if (winTitle.empty())
{
return -1;
}

HWND win_handle = FindWindow(0, winTitle.c_str());
if (win_handle != 0)
{
if (close)
{
TerminateProcess( (HANDLE )GetProcessId( win_handle ), 0);
return 0;
}

SetWindowPos( win_handle, z, x, y, w, h, flags );

if (naked)
{
SetWindowLong(win_handle, GWL_STYLE, GetWindowLong(win_handle, GWL_EXSTYLE) | WS_EX_TOPMOST);
ShowWindow(win_handle, SW_SHOW);
}
}
else
{
cout << "!!! FindWindow failed" << endl;
}

return 0;
}

关于winapi - 在 MS Windows(XP) 上使用来自不同进程的窗口句柄进行窗口操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4023942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com