2012-01-09 34 views
4

私はちょうどC++を学び始めました。現時点で私はまだ解決策を見つけることができない小さなものに積み重ねています。私は誰かがこの問題について私を助けてくれることを願っています。C++で最小化されたウィンドウにキーを送る方法

私の目標:実行中のアプリケーションにいくつかのキーストロークを送信したい。しかし、アプリケーションにフォーカスがない場合、すなわち最小化された場合、またはこれまでに何が行われたのか、キーストロークは依然として である必要があります。

私の問題:私は(笑覚えていない)VK_KEYまたはこれまでに何と機能sendkey()を使用する場合、それが機能していますが、ウィンドウが最大化されている場合のみ(焦点)が、私はPostMessage(GameWindow, WM_KEYDOWN, 'G', 0);何も起こらを使用していないしてみてください。

私はメモ帳で試してみましたが、動作させたいアプリケーションでも何もしませんでした。

私はプロセスにフックしてキーを送信する必要があると思いますが、残念ながら私はC++には問題ありません(あなたが完全にプロ笑いにならない限り)が、フックやそのようなものの経験はありません。

誰かが正しい方向に私を送ることができますか、Windowsゲームの1つなどで、そのようなことを行う方法に関する小さなチュートリアルを私に書いてください。

if(amount != 0) 
{ 
    // bring the window to the front 
    HWND GameWindow = FindWindow(0, L"Naamloos - Kladblok"); 
    SetForegroundWindow(GameWindow); 

    // execute the loop 
    for(int i = 0; i < amount; i++){ 
    // not the last loop so add a pause at the end 
    if(i < (amount-1)) 
    { 
     PostMessage(GameWindow, WM_KEYDOWN, 'G', 0); 
     PostMessage(GameWindow, WM_KEYUP, 'G', 0); 
     Sleep(2000); 
    } 
    // last loop so dont add a pause at the end 
    else 
    { 
     PostMessage(GameWindow, WM_KEYDOWN, 'G', 0); 
     PostMessage(GameWindow, WM_KEYUP, 'G', 0); 
    } 
    } 
} 
+2

エラーはチェックされません。 'FindWindow'が成功していますか?そのような 'SetForegroundWindow'は動作しません。ここのドキュメントを読んでください:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539(v=vs.85).aspx –

+0

あなたの返信ありがとう!はい、それは動作している、私はポップアップウィンドウを参照してください、私はPostMessageのような何かの代わりにsendkeysを使用すると、それは正常に動作します;)コードは正しいので、それはPostMessageは何もしません。 ; – user1137770

+0

まあ、このような入力を偽ったり、時にはうまくいきません。メモ帳内でEDITウィンドウをターゲットにすることができます。しかし、知っているあなたのゲームについては。おそらく、あなたがゲームへのインプットを偽造しようとしていた理由を説明したなら、私たちはよりうまく助けることができました。 –

答えて

3

Win32アプリケーションがWindowsメッセージに対して動作する方法は、完全に独自の裁量に従います。したがって、あなたのターゲットウィンドウ/アプリケーションはメッセージを受信して​​おり、それらを無視するだけである可能性があります。 Microsoft Spy ++(Visual Studioに付属)を使用して、対象のアプリケーションメッセージキューを監視し、受け取った内容を確認することができます。

メモ帳(v5.1)は、最小化されていても(以下のサンプルコード)、WM_CHYメッセージ(WM_KEYDOWN/WM_KEYUPではなく)を聴くことを選択します。

#include "stdafx.h" 
#include "Windows.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HWND hwndWindowTarget; 
    HWND hwndWindowNotepad = FindWindow(NULL, L"Untitled - Notepad"); 
    if (hwndWindowNotepad) 
    { 
     // Find the target Edit window within Notepad. 
     hwndWindowTarget = FindWindowEx(hwndWindowNotepad, NULL, L"Edit", NULL); 
     if (hwndWindowTarget) 
     { 
      PostMessage(hwndWindowTarget, WM_CHAR, 'G', 0); 
     } 
    } 

    return 0; 
} 
+0

プロセスにサブウィンドウがない場合''編集 ''? – Acidic

関連する問題