2017-07-31 7 views
0

現在、このコードを使用して、現在開いているウィンドウのWindows 10に選択したテキストをコピーします。このコードは、 (メモ帳)にフォーカスがあります。メモ帳の選択されたテキストがデータ変数OKにコピーされます。私はホットキーを経由して、まったく同じコードを起動した場合Ctrl + CテキストへのSendInputは、ホットキーから起動したときに機能しません。

wchar_t title[MAX_PATH]; 
HWND target_window = GetForegroundWindow(); 
GetWindowText(target_window, title, MAX_PATH); 
std::wcout << "Target window is '" << title << "'" << std::endl; 

// Send Control + C 
int key_count = 4; 

INPUT* input = new INPUT[key_count]; 
for (int i = 0; i < key_count; i++) 
{ 
    input[i].ki.dwFlags = 0; 
    input[i].type = INPUT_KEYBOARD; 
} 

input[0].ki.wVk = VK_CONTROL; 
input[0].ki.wScan = MapVirtualKey(VK_CONTROL, MAPVK_VK_TO_VSC); 
input[1].ki.wVk = 0x43; // Virtual key code for 'c' 
input[1].ki.wScan = MapVirtualKey(0x43, MAPVK_VK_TO_VSC); 
input[2].ki.dwFlags = KEYEVENTF_KEYUP; 
input[2].ki.wVk = input[0].ki.wVk; 
input[2].ki.wScan = input[0].ki.wScan; 

input[3].ki.dwFlags = KEYEVENTF_KEYUP; 
input[3].ki.wVk = input[1].ki.wVk; 
input[3].ki.wScan = input[1].ki.wScan; 

if (!SendInput(key_count, (LPINPUT)input, sizeof(INPUT))) 
{ 
    // TODO: error handling 
} 
else 
{ 
    // not ideal but not sure of another way to wait for SendInput to complete 
    Sleep(100); 
    if (OpenClipboard(NULL)) 
    { 
     HGLOBAL hglb = GetClipboardData(CF_UNICODETEXT); 
     LPWSTR lpwstr = (LPWSTR)(GlobalLock(hglb)); 
     std::wstring data(lpwstr); 
     GlobalUnlock(hglb); 
     CloseClipboard(); 
     // do something with selected text in data 
    } 
    else 
    { 
     // TODO: error handling 
    } 
} 

しかし、それは動作しません:

if (RegisterHotKey(
    NULL, 
    1, 
    MOD_CONTROL | MOD_ALT | MOD_NOREPEAT, 
    VK_OEM_2)) // back slash question mark key 
{ 
    std::cout << "Hotkey 'Ctrl+Alt+/' registered, using MOD_NOREPEAT flag\n"; 
} 

MSG msg = { 0 }; 
while (GetMessage(&msg, NULL, 0, 0) != 0) 
{ 
    if (msg.message == WM_HOTKEY) 
    { 
     std::cout << "WM_HOTKEY received\n"; 

     // Call function to COPY TEXT here 

     if (RegisterHotKey(
      NULL, 
      1, 
      MOD_CONTROL | MOD_ALT | MOD_NOREPEAT, 
      VK_OEM_2)) // back slash question mark key 
     { 
      std::cout << "Hotkey 'Ctrl+Alt+/' registered, using MOD_NOREPEAT flag\n"; 
     } 
    } 
} 

を今、両方のケースでは、GetWindowText()は私がコピーしたい番組のタイトルを示していますからのテキスト。

さらに、私は簡単なテストユーティリティを書いて、がCtrl + CがWindowに渡されていることを確認しました。 Ctrl + Cが渡されていますが、コピーが実行されていないようです。

+1

最初のコードスニペットのコメントには、クリップボードにコピーしたばかりのデータを処理することが示唆されています。その場合、データをクリップボードにコピーすることは不適切です。ユーザは、あなたのプログラム内のいくつかの操作がそれらの*クリップボードデータを破壊するという事実を欲しない、または意識することさえしないかもしれません。 – IInspectable

+0

私はそれをよく知っています。クリップボードは最終的なプログラムでバックアップおよびリストアされます。クリップボードを使用しないでプログラムからテキストを取得する別の方法がある場合は、それが望ましいでしょう。しかし、私が見つけたことから、テキストを直接取得するための他の方法は、すべてのプログラムで一貫して機能しません。 –

+0

フォアグラウンドウィンドウのアクティブな入力コントロールに 'WM_GETTEXT'を送るだけではどうですか?そのコントロールを見つけるには、['GetGUIThreadInfo()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms633506.aspx)を見てください。 –

答えて

1

はそれがAltキーがあるため、ホットキーの下にまだある、あなたが実際にはCtrl +Altキー + Cを送信していることは可能ですか? SendInputは入力をグローバル入力キューに直接挿入します。

ホットキーに応答してタイマを設定し、入力を生成する前にすべての修飾キーがアップするまで、タイマハンドラでGetAsyncKeyStateを呼び出してみることができます。

このようなハックではなく、UI Automationを使用するとよいでしょう。

+0

すべての修飾キーを確認するGetAsyncKeyStateが問題を解決しました。また、UIオートメーションのフレームワークについても説明しますが、統合する必要のあるサードパーティのアプリケーションではうまく動作しない可能性があります。 –

関連する問題