jjzjj

c++ - 查找窗口并更改其名称

coder 2024-06-20 原文

我正在尝试做的是一种通过进程 ID 找到窗口的方法,获取该窗口的名称并将其更改为我想要的名称。

我发现了一些关于它的东西:(代码 1)

 int WINAPI GetWindowText(
   _In_  HWND   hWnd,
   _Out_ LPTSTR lpString,
   _In_  int    nMaxCount
    );

这个:(代码 2)

    CWnd* pWnd = GetDlgItem(); GetDlgIt
pWnd->SetWindowText(_T("WindowName"));


CString str;
pWnd->GetWindowText(str);
ASSERT(str == _T("WindowName"));

还有这个(代码3)

    HWND WindowHandel = FindWindowA(0, "WindowName"); 

    DWORD proccesID = 0

    GetWindowThreadProcessId(WindowHandel, &proccesID);

我的问题是: 我怎样才能获得进程 ID,获得该进程的窗口名称,这样代码就可以将 Hwnd 识别为我的窗口名称并将其更改为我想要的名称。 像这样:

Process = "anyprocess.exe"
Get Process ID <
Process ID = 1234567
Get window name from the ProcessID we have <
Window name = "ILoveYou"
Change "ILoveYou" to "IHaveYou"

如果我有多个同名窗口,有一种方法可以检查第一个打开的窗口,这样我就不会更改其他窗口吗?

在我看来,从进程 ID 中获取 WindowName 似乎更安全,问题是我不想对代码说我知道窗口名称,我希望它能找到它并像 Liam Neeson 一样更改它对付那些坏人。

而且我还想知道更多关于使用那些“(0,....”或“(NULL,....”的信息,“FindWindowA”命令只是一个例子,我总是看到这个并且不要不知道如何正确使用它:

    FindWindowA(0, "WindowName")

我想要的例子会对我有很大帮助 =) 感谢您的耐心等待。

最佳答案

不,这是不可能的。多个窗口可以具有相同的 PID。

但是,假设目标应用程序是单线程的,只有一个可见窗口,您可以遍历所有窗口并检查它们的 PID 以找到匹配项。您必须跳过不可见的窗口。或者更好的是,跳过非 Alt-Tab 窗口。这是它是如何完成的。

注意,我写这个只是为了好玩,我自己不会把它放在任何应用程序中。

BOOL IsAltTabWindow(HWND hwnd)
{
    if (!IsWindowVisible(hwnd)) return FALSE;

    HWND next = NULL;
    HWND parent = GetAncestor(hwnd, GA_ROOTOWNER);
    while (parent != next)
    {
        next = parent;
        parent = GetLastActivePopup(parent);
        if (IsWindowVisible(parent)) break;
    }
    if (next != hwnd) return FALSE;

    TITLEBARINFO ti = { 0 };
    ti.cbSize = sizeof(ti);
    GetTitleBarInfo(hwnd, &ti);
    if (ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) return FALSE;

    if (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) return FALSE;

    return TRUE;
}

BOOL CALLBACK enumProc(HWND hwnd, LPARAM lp)
{
    DWORD search_pid = DWORD(lp);
    if (!IsAltTabWindow(hwnd))
        return 1;
    DWORD pid = 0;
    GetWindowThreadProcessId(hwnd, &pid);
    if (pid != search_pid) return 1;
    SetWindowText(hwnd, "un-advised code");
    return 0;
}

int main()
{
    DWORD search_pid = 0;
    HWND hwnd = FindWindow(0, "Find me");
    GetWindowThreadProcessId(hwnd, &search_pid);

    EnumWindows(enumProc, LPARAM(search_pid));

    return 0;
}


编辑,解释:

试试下面的代码。首先运行Window 的记事本,确保只有一个记事本实例。

如果你在 Windows 10 上运行下面的代码,它不会显示一个,而是 3 个与记事本具有相同 PID 的窗口。其中 2 个窗口是不可见的,它们由操作系统使用,我们不应该触摸它们。

所以我们至少要跳过不可见的窗口。还有许多其他系统窗口,我们也不希望与它们有任何关系。

IsAltTabWindow 是避免这些窗口的好方法。这确保我们只查看可以通过 Alt-Tab 键访问的窗口。

int main()
{
    HWND hwnd = FindWindow("Notepad", 0);
    if (!hwnd) return 0;
    DWORD search_pid = 0;
    GetWindowThreadProcessId(hwnd, &search_pid);

    for (hwnd = GetWindow(GetDesktopWindow(), GW_CHILD); 
        hwnd; hwnd = GetWindow(hwnd, GW_HWNDNEXT))
    {
        char buf[300];
        GetWindowText(hwnd, buf, 300);

        DWORD pid = 0;
        GetWindowThreadProcessId(hwnd, &pid);
        if (pid == search_pid)
            std::cout << pid << "\n";
    }

    return 0;
}

关于c++ - 查找窗口并更改其名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35917056/

有关c++ - 查找窗口并更改其名称的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  7. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

随机推荐