2016-06-13 7 views
-1

私はWindowsのコンソールアプリケーションからChromeのウィンドウのサイズを取得しようとしていますが、Win32 APIから問題が発生しているようです。ここでWindows APIからChromeアプリケーションウィンドウの高さと幅を取得しようとしていますか?

は、私がこれまで何をやったかだ:私はRECT構造体から結果を取得すると

BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam) 
{ 
    DWORD lpdwProcessId; 
    GetWindowThreadProcessId(hwnd,&lpdwProcessId); 
    if(lpdwProcessId==lParam) 
    { 
     g_HWND=hwnd; 
     return FALSE; 
    } 
    return TRUE; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    charArray = "chrome.exe"; 

    // getting process id from name 
    PROCESSENTRY32 entry; 
    entry.dwSize = sizeof(PROCESSENTRY32); 
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 

    if (Process32First(snapshot, &entry) == TRUE) 
    { 
     while (Process32Next(snapshot, &entry) == TRUE) 
     { 
      CString strProcessName = entry.szExeFile; 

      //if (stricmp(entry.szExeFile, charArray) == 0) 
      if (strProcessName == charArray) 
      { 
       HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); 
       EnumWindows(EnumWindowsProcMy, entry.th32ProcessID); 
       // g_HWND now has HWND for the process chrome.exe. 
       hWindowFromProcess = g_HWND; 
       int result = 0, result2 = 0; 
       result = GetWindowRect(g_HWND, &g_Rect); 

       LONG nWidth = g_Rect.right - g_Rect.left; 
       LONG nHeight = g_Rect.bottom - g_Rect.top; 
       CloseHandle(hProcess); 
      } 
     } 
    } 
} 

、私は遠く離れている値を取得しておきます。たとえば、1920 x 1080の画面でウィンドウを最大化すると、幅は71ピクセル、高さは16ピクセルになります。私はまた、それがウィンドウを変更するサイズに関係なく、RECTの値は同じままであることに気づいた。別のウィンドウ(cmd.exeなど)でテストすると、正しいRECT値が得られます。

私は、ブラウザのレンダリングがWinAPI以外の方法で行われていると仮定しています。私はjavascriptを使用してブラウザの寸法を取得することに関するいくつかの記事を見てきましたが、私はこの情報をWindowsアプリケーションから必要としています。

+0

あなたのアプローチには2つの問題があります。まず、 'EnumWindows'は、システム内のすべてのトップレベルウィンドウを列挙します。クロムはおそらく多くのウィンドウを使用するので、最初に見つけたものを選ぶだけで、それがあなたが望むものであることを知るには不十分です。次に、Chromeが動作しているときにタスクマネージャを見たことがありますか?約4000の異なるプロセスを作成します。だから、間違ったウィンドウを見つけているだけでなく、間違ったプロセスから間違ったウィンドウを見つけている可能性が高いです。 –

+0

こんにちはJonathan、 私はProcess32Next()はすべてのChromeプロセスを通過すると思います。ブラウザでChromeのタスクマネージャ(Shift-Esc)を確認したところ、ブラウザのタスクマネージャで報告されたものとwhileループの繰り返し回数が一致していました。 (つまり、すべての拡張機能がオフになっていると、余分なタブごとに2つのプロセス+ 1つのプロセスが追加されます)さらに、Chromeが稼動している間、実行中のプロセス数、オフ時の数値、 –

+1

明らかに正しいウィンドウが表示されません。 Spy ++を使って正しいものを見つける。 –

答えて

0

クロムは、いくつかの目に見えないウィンドウを使用します。あなたはそれらをスキップすることになっています。 Chromeのウィンドウが自分のクラス名"Chrome_WidgetWin_1"を持って、

またTマクロとグローバル変数を避けるようにしてください(あなたがスパイ++ツールからこの情報を見つけることができます)ウィンドウを見つけるために使用することができます。ここにUnicodeの例があります:

int wmain() 
{ 
    HWND hwnd = NULL; 
    for (;;) 
    { 
     hwnd = FindWindowEx(0, hwnd, L"Chrome_WidgetWin_1", 0); 
     if (!hwnd) 
      break; 

     if (!IsWindowVisible(hwnd)) 
      continue;      

     RECT rect; 
     GetWindowRect(hwnd, &rect); 
     int w = rect.right - rect.left; 
     int h = rect.bottom - rect.top; 
     cout << w << ", " << h << "\n"; 
     break; 
    } 

    return 0; 
} 
関連する問題