2012-03-23 9 views
4

私はC++の初心者です(いつもC#でした)、私はC++で書かれたレガシープログラムの運営/更新に携わりました。C++のプロセス名を使用して前面のウィンドウに移動します

私はウィンドウ上で動作するプロセス名 "setup.exe"を持っており、そのハンドルとDWORDプロセスIDを見つける方法を知っていました。私はそれが確かにウィンドウがあることを知っているが、私はこのウィンドウをフォアグラウンドに持っていく方法を見つけることができないと思う。それは私がやろうとしていることである:プロセス名を使ってウィンドウをフォアグラウンドに持っていく。私は、私もわからないんだけど、次のアルゴリズムに来て、インターネット上で読んだ時に

はそれを行うための適切な方法である:

  1. は、プロセス名からプロセスIDを検索します。
  2. 列挙上記のステップは、私のタイプのウィンドウハンドル(複数可)の変数を与えるEnumWindows
  3. を使用して、このプロセスIDに属しているすべてのウィンドウ - HWND
  4. 私はこれを渡すことによってフォーカスを設定またはフォアグラウンドを設定することができますHWND変数。

私の問題は構文が賢明なことです。enumwindowsを書き始める方法を実際にはわかりません。誰かがサンプルコードのセットを指すことができますか、この問題にどのようにアプローチすべきかについてのポインタがあれば?

ありがとうございます。

+0

ません。あなたはすでにAPI名が何であるか知っています。自分で何かを試して書き、特定の質問をしてください。それが立てば、これは広すぎます。 Stack Overflowには数百万のEnumWindowsに関する質問があります。右のリストを見てください。 –

答えて

5

EnumWindowsプロシージャは、すべての最上位ウィンドウを評価します。あなたが探しているウィンドウがトップレベルであることを確認している場合、あなたはこのコードを使用することができます:

#include <windows.h> 

// This gets called by winapi for every window on the desktop 
BOOL CALLBACK EnumWindowsProc(HWND windowHandle, LPARAM lParam) { 
    DWORD searchedProcessId = (DWORD)lParam; // This is the process ID we search for (passed from BringToForeground as lParam) 
    DWORD windowProcessId = 0; 
    GetWindowThreadProcessId(windowHandle, &windowProcessId); // Get process ID of the window we just found 
    if (searchedProcessId == windowProcessId) { // Is it the process we care about? 
     SetForegroundWindow(windowHandle); // Set the found window to foreground 
     return FALSE; // Stop enumerating windows 
    } 
    return TRUE; // Continue enumerating 
} 

void BringToForeground(DWORD processId) { 
    EnumWindows(&EnumWindowsProc, (LPARAM)processId); 
} 

をそれからちょうどあなたがしたいプロセスIDとBringToForegroundを呼び出します。

免責事項:テストが、動作するはずです:)あなたは、サンプルコードを自分のために検索することができ

+3

もちろん、SetForegroundWindowを呼び出すには、現在のフォアグラウンドプロセスである必要があります。 –

+0

ありがとう、私はこのコードを試しましたが、私は取得し続けています:エラーC2065: 'EnumWindowsProc':宣言されていない識別子。私は静的なboolコールバックとしてヘッダーファイルでこれを宣言しようとしましたが、まだ運がありません。 .....もしあなたが何かを持っていれば、私はあなたのフィードバックを待っています。 – Fylix

+0

ありがとうDark_Charlie、私はヘッダファイルに宣言されたコールバック関数を持っていました。私はこの作品を手に入れました。私が欠いていたのは、変数としてのコールバック関数の宣言でした。 – Fylix

3
SetWindowPos(windowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE); // it will bring window at the most front but makes it Always On Top. 

SetWindowPos(windowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE); // just after above call, disable Always on Top. 
関連する問題