2012-01-09 70 views
4

我剛開始學習C++。目前,我正處於一個小事情,我還找不到解決方案。我希望有人能幫助我解決這個問題。如何將密鑰發送到C++中的最小化窗口

我的目標:我想發送幾個擊鍵到正在運行的應用程序。但是,當應用程序沒有焦點,即最小化或以往任何時候,擊鍵應仍然是 發送到應用程序。

我的問題:當我使用功能sendkey()VK_KEY或什麼都(不記得笑),那麼它是工作,但只有在窗口最大化(聚焦),但是當我嘗試使用PostMessage(GameWindow, WM_KEYDOWN, 'G', 0);沒有任何反應。

我在記事本上試過它,但也在我希望它工作但沒有任何應用程序。我想我需要掛鉤的過程,然後發送密鑰,不幸的是我沒有與C + +的問題(除非你完全親lol),但我沒有經驗什麼,所以從來沒有鉤和那種東西。

任何人都可以發送我正確的方向,或給我寫一個關於如何做這樣的事情,例如與Windows遊戲之一的小教程?

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 – 2012-01-09 00:14:02

+0

感謝您的回覆!是的,它正在工作,我看到記事本窗口彈出,當我使用sendkeys而不是像PostMessage的其他東西,它確實工作正常;)因此,代碼是正確的,它只是PostMessage不會做一件事; ; – user1137770 2012-01-09 00:50:08

+0

那麼,有時你可以像這樣僞造輸入,有時它不起作用。您可以嘗試在記事本中定位編輯窗口。但至於你知道的遊戲。如果你解釋了爲什麼你試圖對遊戲進行虛假輸入,也許我們可以做得更好。 – 2012-01-09 01:09:42

回答

3

Win32應用程序對Windows消息的行爲方式完全由其自行決定。所以它可能是你的目標窗口/應用程序正在接收消息,只是選擇忽略它們。您可以使用Microsoft Spy ++(隨Visual Studio提供)來觀察目標應用程序消息隊列並查看它收到的內容。

記事本(v5.1)選擇聽取WM_CHAR消息(而不是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 2017-09-11 23:35:09