Здравствуйте! Никак не могу найти реализацию стандартной вставки текста из буфера обмена, т.е. не могу - как windows вставляет текст в разные приложения из буфера обмена в заданое положение курсора, какие при этом использует winapi функции. Подскажите пожалуйста. Я это спросил, т.к. эмуляция нажатия клавиш (ctrl+v) почему-то не работает в windows 7.
invoke keybd_event,VK_CONTROL, 0, 0, 0 invoke keybd_event,56h, 0, 0, 0 invoke keybd_event,56h, 0, KEYEVENTF_KEYUP, 0 invoke keybd_event,VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
Valentin keybd_event работает, но ... можно ли как-нибудь приаттачить нажатия клавиш в определенное окно? krid24 посмотрел там код, но не нашёл то, что нужно. Там за функцию вставки отвечает функция "ReplaceSelection", которая задаётся приложением.
Код (Text): VOID WINAPI EditPaste(VOID) { PLABELBOX pbox; HGLOBAL hglb; LPTSTR lptstr; PLABELBOX pboxCopy; int cx, cy; HWND hwnd; pbox = hwndSelected == NULL ? NULL : (PLABELBOX) GetWindowLong(hwndSelected, 0); // If the application is in edit mode, // get the clipboard text. if (pbox != NULL && pbox->fEdit) { if (!IsClipboardFormatAvailable(CF_TEXT)) return; if (!OpenClipboard(hwndMain)) return; hglb = GetClipboardData(CF_TEXT); if (hglb != NULL) { lptstr = GlobalLock(hglb); if (lptstr != NULL) { // Call the application-defined ReplaceSelection // function to insert the text and repaint the // window. ReplaceSelection(hwndSelected, pbox, lptstr); GlobalUnlock(hglb); } } CloseClipboard(); return; } // If the application is not in edit mode, // create a label window. if (!IsClipboardFormatAvailable(uLabelFormat)) return; if (!OpenClipboard(hwndMain)) return; hglb = GetClipboardData(uLabelFormat); if (hglb != NULL) { pboxCopy = GlobalLock(hglb); if (pboxCopy != NULL) { cx = pboxCopy->rcText.right + CX_MARGIN; cy = pboxCopy->rcText.top * 2 + cyText; hwnd = CreateWindowEx( WS_EX_NOPARENTNOTIFY | WS_EX_TRANSPARENT, atchClassChild, NULL, WS_CHILD, 0, 0, cx, cy, hwndMain, NULL, hinst, NULL ); if (hwnd != NULL) { pbox = (PLABELBOX) GetWindowLong(hwnd, 0); memcpy(pbox, pboxCopy, sizeof(LABELBOX)); ShowWindow(hwnd, SW_SHOWNORMAL); SetFocus(hwnd); } GlobalUnlock(hglb); } } CloseClipboard(); } найти этот пример было чрезвычайно сложно.
Код (Text): SendPasteMsg: call [GetCurrentThreadId] push eax ;For later usage. call [GetForegroundWindow] push 0 ;GetWindowThreadProcessId.lpdwProcessId. push eax ;GetWindowThreadProcessId.hWnd. call [GetWindowThreadProcessId] pop edx ;CurrentThreadId. push 0 ;AttachThreadInput(b).fAttach. push edx ;AttachThreadInput(b).idAttachTo. push eax ;AttachThreadInput(b).idAttach. push 1 ;AttachThreadInput.fAttach. push edx ;AttachThreadInput.idAttachTo. push eax ;AttachThreadInput.idAttach. call [AttachThreadInput] call [GetFocus] ;Gotcha! push 0 ;SendMessage.lParam. push 0 ;SendMessage.wParam. push WM_PASTE ;SendMessage.uMsg. push eax ;SendMessage.hWnd. call [SendMessage] call [AttachThreadInput] ;(Detach). ret Вот такая штука есть ещё. Писал много лет назад для плагина, который вставляет в по хоткею в текущее окно трек из винампа (сначала в буфер обмена копирует, а потом дёргает эту функцию).
Valentin Попробовал в блокнот отправить, но отправляется только в текущее окно (код на автоите): Код (Text): $PID=ProcessExists("notepad.exe") $current_thread_id=_WinAPI_GetCurrentThreadId() $notepad_thread_id=_WinAPI_GetWindowThreadProcessId(WinGetHandle("[CLASS:Notepad]"), $PID) _WinAPI_AttachThreadInput($current_thread_id, $notepad_thread_id, 1) _WinAPI_SetFocus(WinGetHandle("[CLASS:Notepad]")) _keybd_event(0x11,0,0,0) _keybd_event(0x56,0,0,0) _keybd_event(0x56,0,0x2,0) _keybd_event(0x11,0,0x2,0) Может что-то не так сделал? Или SetFocus и keybd_event не связаны? maksim_ я смотрел этот код, и выше написал своё мнение про него. в этом коде я заметил только основные функции вставки и чтения текста из буфера обмена, функцию вставки текста из буфера обмена в какое-либо приложение не заметил, единственно что заметил - это функцию ReplaceSelection, которую как я понял нужно написать самому. leo До этого тоже такое пробовал, но не в любое приложение можно вставить текст. В консоль counter-strike не вставляет. В msdn написано, что вставить можно вроде только в edit и сомбо. iZzz32 пробовал, SendMessage с WM_PASTE не хочет отправлять туда, куда нужно.