2017-04-18 2 views
1

私は、ユーザー定義プロセスが実行されているかどうかに基づいてファイルを条件付きでコピーするプログラムを作成しています。今、ユーザーがプロセスを選択しているので、私は彼らが本当に気にするものまで選択できるプロセスをフィルタリングしたいと思います。基本的に私はちょうどalt-tabすることができるプロセス/ウィンドウを必要とします。私は実行中のプロセスを取得するためのいくつかの方法を見つけましたが、私が探しているものにそれらをフィルタリングする方法を考え出すことはあまりありませんでした。今、これは私がプロセス名を&のウィンドウ名にするために使用しているコードですが、おそらくもっと良い方法があるようです。ユーザー関連のプロセス/ウィンドウの一覧を取得する

(これはQTを使用していますQStringとQStringListはどこから来ていますか)

HWND hwnd_current = GetWindow(GetDesktopWindow(), GW_CHILD); 
QStringList process_list; 
do { 
    wchar_t str_window_name[MAX_PATH]; 
    DWORD pid; 
    DWORD exStyles = (DWORD)GetWindowLongPtr(hwnd_current, GWL_EXSTYLE); 
    DWORD styles = (DWORD)GetWindowLongPtr(hwnd_current, GWL_STYLE); 

    if(!((exStyles & WS_EX_TOOLWINDOW) == 0 && (styles & WS_CHILD) == 0)){ 
     continue; 
    } 
    if(!GetWindowText(hwnd_current, str_window_name, MAX_PATH)){ 
     continue; 
    } 
    GetWindowThreadProcessId(hwnd_current, &pid); 
    if(pid == GetCurrentProcessId()){ 
     continue; 
    } 

    wchar_t fileName[MAX_PATH]; 
    LPWSTR file_name; 
    HANDLE hProcess; 
    hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ, FALSE, pid); 
    if(hProcess){ 
     DWORD dwSize = MAX_PATH; 
     QueryFullProcessImageName(hProcess, 0, fileName, &dwSize); 
     file_name = PathFindFileName(fileName); 
    } 
    CloseHandle(hProcess); 
    QString boxString = QString("["); 
    #ifdef UNICODE 
    QString q_file_name = QString::fromStdWString(file_name); 
    QString q_str_window_name = QString::fromStdWString(str_window_name); 
    #else 
    QString q_file_name = QString::fromStdString(file_name); 
    QString q_str_window_name = QString::fromStdString(str_window_name); 
    #endif 
    boxString.append(q_file_name); 
    boxString.append("] "); 
    boxString.append(q_str_window_name); 

    if(!q_file_name.isEmpty() && !q_str_window_name.isEmpty() && !pNameList.contains(boxString) && !process_list.contains(q_file_name)){ 
     if(!q_str_window_name.endsWith("MSCTFIME UI") && !q_str_window_name.endsWith("Default IME")){ 
      process_list.append(q_file_name); 
      pNameList.append(boxString); 
     } 
    } 

} while (hwnd_current = GetNextWindow(hwnd_current, GW_HWNDNEXT)); 

アドバイスはありがとうございます!ありがとう!

答えて

1

これは、taskbar filters windowsと非常によく似ています。

かなり近いようですが、ウィンドウが表示されていることを確認してください。WS_EX_APPWINDOWは、ツールウィンドウをtreated as a normal windowにすることができます。

関連する問題