2016-04-15 16 views
-1

正如我的標題所述,我試圖從我正在編寫的C++應用程序中移動數據,並將它輸入到Windows中的任何桌面應用程序的字段(特別是用戶名和密碼字段)中。它需要適用於所有應用程序。將數據粘貼到任何應用程序輸入字段中,而不模擬Ctrl + V。 Windows C++

現在我已經寫了一個小程序,它將數據複製到剪貼板,然後模擬Ctrl + V鍵盤按下來粘貼數據。然而,這樣做感覺像一個非常醜陋的方式來做到這一點。我的問題是,有沒有更好的方法?

Ps。從我做的一切似乎都要求你以某種方式修改接收應用程序。不幸的是這個選項對我來說不可用。因此,任何涉及調整接收應用程序的解決方案都不會有幫助。

謝謝你的幫助!

+0

應該有幾個例子,告訴你如何做到這一點:http://stackoverflow.com/questions/2113950/how-to-send-keystrokes-to-a-window。如果您需要設置輸入字段的焦點,我確信有辦法做到這一點 – Marged

+0

謝謝!這絕對看起來更好,當我第一次遇到這種情況時,我的印象是,這不適用於所有應用程序。但似乎我錯了。我現在試着去實現它。 此外,我是新來的stackoverflow,我現在做的正確的事情是什麼?關閉這個問題?以某種方式向上推動你? – SledoMalset

+0

@Marged:這要求,目的地確實是一個本地窗口(可通過它的'HWND'訪問)。通常情況並非如此,解決方案將無法工作。記錄和支持的用於自動化UI的解決方案是[UI自動化](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)。 – IInspectable

回答

0

將鍵擊發送到另一個應用程序不是一個好的解決方案。有很多潛在的問題,例如C# sendkeys to other application to particular textfield。更好的解決方案是更直接地與其他程序進行交互。它需要對Windows的工作方式有更多的技術理解。其中許多優點之一是,您可以像編寫它一樣輕鬆地閱讀其他應用程序中的文本。

有關示例,請參閱我的Clicking a Button in Another Application,但使用C#。我希望這個解釋至少是有幫助的。可以使用相同的技術將數據放入文本框或文本框中,然後單擊按鈕。 WM_SETTEXT message將用於將數據放入另一個應用程序的文本框中。以下是將文本放入記事本的示例控制檯程序。

#include "stdafx.h" 

struct pidandhwnd { 
    DWORD dwProcessId; 
    HWND hwnd; 
}; 

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) 
{ 
    pidandhwnd *ppnh = (pidandhwnd *)lParam; 
    DWORD dwProcessId; 
    GetWindowThreadProcessId(hwnd, &dwProcessId); 
    if (ppnh->dwProcessId == dwProcessId) 
    { 
     ppnh->hwnd = hwnd; 
     return FALSE; 
    } 
    return TRUE; 
} 

int main() 
{ 
    TCHAR szCmdline[] = TEXT("Notepad.exe"); 
    PROCESS_INFORMATION piProcInfo; 
    STARTUPINFO siStartInfo; 
    BOOL bSuccess = FALSE; 

    ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); 
    ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); 
    siStartInfo.cb = sizeof(STARTUPINFO); 
    siStartInfo.hStdError = NULL; 
    siStartInfo.hStdOutput = NULL; 
    siStartInfo.hStdInput = NULL; 

    LPARAM lParam = NULL; 
    pidandhwnd pnh; 

    const int ControlId = 15; // Edit control in Notepad 
    HWND hEditWnd; 

    bSuccess = CreateProcess(NULL, 
     szCmdline,  // command line 
     NULL,   // process security attributes 
     NULL,   // primary thread security attributes 
     TRUE,   // handles are inherited 
     0,    // creation flags 
     NULL,   // use parent's environment 
     NULL,   // use parent's current directory 
     &siStartInfo, // STARTUPINFO pointer 
     &piProcInfo); // receives PROCESS_INFORMATION 
    if (!bSuccess) { 
     std::cout << "Process not started\n"; 
     return 0; 
     } 
    std::cout << piProcInfo.dwProcessId << " Notepad Process Id\n"; 

    WaitForInputIdle(piProcInfo.hProcess, 1000); 

    pnh.dwProcessId = piProcInfo.dwProcessId; 
    pnh.hwnd = NULL; 
    EnumDesktopWindows(NULL, EnumWindowsProc, (LPARAM)&pnh); 
    if (pnh.hwnd == NULL) 
    { 
     std::cout << "Notepad not found\n"; 
     return 0; 
    } 
    //std::cout << "Notepad found\n"; 

    // Get the edit box on Notepad 
    hEditWnd = GetDlgItem(pnh.hwnd, ControlId); 
    // Send the text 
    SendMessage(hEditWnd, WM_SETTEXT, NULL, (LPARAM)_T("This is from somewhere else.")); 

    return 0; 
} 
+0

非常感謝您的詳細解答!(對於我的反應遲緩,感到抱歉)如果沒有問題,我有幾個後續問題。 點擊一個按鈕的例子似乎可能對我非常有用,但我仍然不是100%的操作系統知識。是否有應用程序不受間諜++的影響?也就是說,是否有特定的應用程序類別,我無法訪問文本框(在我的情況下是用戶名/密碼),還是操作系統使得這些字段總是可以被窺探到? – SledoMalset

+0

我很抱歉沒有看到這更快。這不適用於使用較新技術的軟件,但我不知道是否有相應的解決方案。我也不知道應用程序能夠如何保護自己免受這種事情的影響。他們可以但可能不完全。你可以創建一個新的問題來詢問具體細節。 – user34660

相關問題