web-dev-qa-db-ja.com

FindWindowがウィンドウを見つけられない

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

しかし、結果は常に同じです。誰かが私を助けてくれることを願っています。

8
ginc0de
 HWND Find = ::FindWindowEx(0, 0, "MozillaUIWindowClass", 0);
9
David Brabant

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;
}
14
typ1232

アプリケーションのフルネームを使用する必要があります(Windowsタスクマネージャー-> [アプリケーション]タブに表示されます)

例:

Google - Mozilla Firefox

(FirefoxでGoogleタブを開いた後)

2
tungnguyen

[〜#〜] msdn [〜#〜] によると

lpWindowName [in、オプション]

Type: LPCTSTR

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

したがって、Firefoxウィンドウのタイトルが「MozillaFirefox」になることはないため、WindowNameを「MozillaFirefox」にすることはできませんが、「MozillaFirefoxスタートページ-MozillaFirefox」など、Webページの名前によって異なります。これがサンプル画像です Firefox's real tiltle

したがって、コードは次のようになります(正確なウィンドウのタイトル名がある場合、以下のコードは機能します-のみ機能します: "Mozilla Firefox Start Page-上の画像のようなMozillaFirefox」。Windows8.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.
}
1
123iamking