【问题标题】:FindWindow does not find the a windowFindWindow 没有找到一个窗口
【发布时间】:2013-05-08 00:10:50
【问题描述】:

我计划用 C++ 制作一个简单的培训控制台,但第一步我遇到了 FindWindow() 的问题

#include <stdio.h>
#include <cstdlib>
#include <windows.h>
#include <winuser.h>
#include <conio.h>

LPCTSTR WindowName = "Mozilla Firefox";
HWND Find = FindWindow(NULL,WindowName);
int main(){
    if(Find)
    {
        printf("FOUND\n");
        getch();
    }
    else{
        printf("NOT FOUND");
        getch();
    }
}

上面的代码我用FindWindow()这个命令来试一下,但是当我执行的时候输出总是显示

没有找到

我已经替换了来自

的属性项目上的字符集

使用 Unicode 字符集

使用多字节字符集

LPCTSTR

LPCSTR

LPCWSTR

但结果总是一样的,我希望任何人都可以帮助我。

【问题讨论】:

  • 你确定窗口标题实际上是Mozilla Firefox?不是页面标题吗?也应该是_T("Mozilla Firefox")
  • 使用 Spy++ 之类的,并确保它真的有那个标题。
  • 很明显的问题,但是实际上有一个带有那个确切标题的窗口吗?我启动了 Firefox,使用了 Spy++,但没有看到这样的窗口。此外,按标题搜索窗口似乎充其量是脆弱的。
  • 我不知道确切的标题窗口,但是当光标悬停时显示 Mozilla Firefox

标签: c++ winapi visual-c++


【解决方案1】:

FindWindow 仅在窗口具有确切指定的标题时才找到窗口,而不仅仅是子字符串。

您也可以:


搜索窗口类名:

HWND hWnd = FindWindow("MozillaWindowClass", 0);

enumerate所有窗口并在标题上执行自定义模式搜索:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    char buffer[128];
    int written = GetWindowTextA(hwnd, buffer, 128);
    if (written && strstr(buffer,"Mozilla Firefox") != NULL) {
        *(HWND*)lParam = hwnd;
        return FALSE;
    }
    return TRUE;
}

HWND GetFirefoxHwnd()
{
    HWND hWnd = NULL;
    EnumWindows(EnumWindowsProc, &hWnd);
    return hWnd;
}

【讨论】:

    【解决方案2】:
     HWND Find = ::FindWindowEx(0, 0, "MozillaUIWindowClass", 0);
    

    【讨论】:

    • FindWindow() 和 FindWindowEx() 有什么区别??我是 C++ 新手,这是来自校园的作业
    • FindWindowEx 还搜索子窗口,从您选择指定的父窗口(第一个参数)开始。如果此第一个参数为空,则该函数使用桌面窗口作为父窗口。该函数在作为桌面子窗口的窗口中进行搜索。
    【解决方案3】:

    根据MSDN

    lpWindowName [输入,可选]

    Type: LPCTSTR
    
    The window name (the window's title). If this parameter is NULL, all window names match.
    

    因此,您的 WindowName 不能是“Mozilla Firefox”,因为 Firefox 窗口的标题永远不会是“Mozilla Firefox”,但它可能是“Mozilla Firefox Start Page - Mozilla Firefox”或其他取决于网页名称的名称。 这是示例图片

    因此,您的代码应该是这样的(下面的代码仅适用 - 仅适用如果您具有确切的窗口标题名称:“Mozilla Firefox Start Page - Mozilla Firefox”,如上图所示。我已经在 Windows 8.1 上进行了测试,并且可以正常工作)

    void CaptureWindow()
    {
    
    
    RECT rc;
    HWND hwnd = ::FindWindow(0, _T("Mozilla Firefox Start Page - Mozilla Firefox"));//::FindWindow(0,_T("ScreenCapture (Running) - Microsoft Visual Studio"));//::FindWindow(0, _T("Calculator"));//= FindWindow("Notepad", NULL);    //You get the ideal?
    if (hwnd == NULL)
    {
        return;
    }
    GetClientRect(hwnd, &rc);
    
    //create
    HDC hdcScreen = GetDC(NULL);
    HDC hdc = CreateCompatibleDC(hdcScreen);
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
        rc.right - rc.left, rc.bottom - rc.top);
    SelectObject(hdc, hbmp);
    
    //Print to memory hdc
    PrintWindow(hwnd, hdc, PW_CLIENTONLY);
    
    //copy to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hbmp);
    CloseClipboard();
    
    //release
    DeleteDC(hdc);
    DeleteObject(hbmp);
    ReleaseDC(NULL, hdcScreen);
    
    //Play(TEXT("photoclick.wav"));//This is just a function to play a sound, you can write it yourself, but it doesn't matter in this example so I comment it out.
    }
    

    【讨论】:

      【解决方案4】:

      您需要使用应用程序的全名(如在 Windows 任务管理器 -> 应用程序选项卡中看到的)

      例子:

      Google - Mozilla Firefox

      (在 Firefox 中打开 Google 标签后)

      【讨论】:

        猜你喜欢
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        相关资源
        最近更新 更多