2013-05-13 25 views
5

Hey guys Tôi đã kế hoạch làm một huấn luyện viên giao diện điều khiển đơn giản với C++ nhưng bước đầu tiên tôi đã có vấn đề với FindWindow()FindWindow không tìm thấy một cửa sổ

#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(); 
    } 
} 

Đoạn mã trên tôi sử dụng để thử liệu FindWindow lệnh() nhưng khi tôi thực hiện các đầu ra luôn luôn hiển thị

NOT FOUND

tôi đã thay thế nhân vật Nằm trên dự án bất động sản từ

Sử dụng Unicode Character Set

để

Sử dụng Multi-Byte Set

LPCTSTR

để

LPCSTR

hoặc

LPCWSTR

nhưng kết quả luôn luôn giống nhau, tôi hy vọng bất cứ ai có thể giúp tôi.

+4

Bạn có chắc chắn tiêu đề cửa sổ thực sự là 'Mozilla Firefox' không? Nó không phải là tiêu đề trang? Cũng có lẽ đó nên là '_T (" Mozilla Firefox ")' – mwerschy

+1

Sử dụng Spy ++ hoặc một cái gì đó và chắc chắn rằng nó thực sự có tiêu đề đó. – chris

+2

Câu hỏi rõ ràng, nhưng có * thực sự * một cửa sổ có tiêu đề * chính xác * đó không? Tôi đã khởi chạy Firefox, sử dụng Spy ++ và không thấy cửa sổ như vậy. Bên cạnh đó, tìm kiếm các cửa sổ theo tiêu đề có vẻ, tốt nhất, mong manh. –

Trả lời

7
HWND Find = ::FindWindowEx(0, 0, "MozillaUIWindowClass", 0); 
+0

sự khác biệt FindWindow() với FindWindowEx() là gì ?? Tôi mới trong C + + và đây là nhiệm vụ từ trường học – ginc0de

+1

FindWindowEx cũng tìm kiếm cửa sổ con, bắt đầu với cửa sổ cha mẹ bạn tùy chọn quy định (param đầu tiên). Nếu tham số đầu tiên này là null, hàm sử dụng cửa sổ màn hình làm cửa sổ chính. Chức năng tìm kiếm giữa các cửa sổ là cửa sổ con của màn hình nền. –

+0

có, Đó là công việc :) cảm ơn bạn rất nhiều – ginc0de

11

FindWindow chỉ tìm cửa sổ nếu nó có tiêu đề được chỉ định chính xác, không chỉ là chuỗi con.

Hoặc bạn có thể:


tìm kiếm cho tên lớp cửa sổ:

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

enumerate tất cả cửa sổ và thực hiện mô hình tùy chỉnh tìm kiếm trên các chức danh:

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; 
} 
+0

Ok cảm ơn dude Tôi sẽ cố gắng code.Thank của một lần nữa :) – ginc0de

2

Y ou cần phải sử dụng tên đầy đủ của ứng dụng (như đã thấy trong Windows Task Manager -> tab Application)

Ví dụ:

Google - Mozilla Firefox

(sau khi mở một tab Google trong Firefox)

0

theo MSDN

lpWindowName [trong, không bắt buộc]

Type: LPCTSTR 

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

Vì vậy, WindowName không thể là "Mozilla Firefox", vì tiêu đề cửa sổ Firefox không bao giờ là "Mozilla Firefox" nhưng nó có thể là "Mozilla Firefox Start Page - Mozilla Firefox" hoặc thứ gì đó tùy thuộc vào trang web Tên. Dưới đây là hình ảnh ví dụ Firefox's real tiltle

Như vậy mã của bạn nên là như thế này, (mã dưới đây chỉ công việc - chỉ làm việc nếu bạn có tên tiêu đề chính xác của cửa sổ: "Mozilla Firefox Start Page - Mozilla Firefox" như hình ảnh ở trên. Tôi đã thử nghiệm trên Windows 8.1 và đã hoạt động)

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. 
}