im bằng cách sử dụng keybd_event(); và tôi muốn sử dụng SendMessage(); để gửi tổ hợp phím để notepad, điều này có thể được thực hiện?Làm cách nào để gửi các lần nhấn phím vào một cửa sổ?
Trả lời
sử dụng SendMessage
để chèn văn bản vào chỉnh sửa đệm (mà có vẻ như bạn muốn):
HWND notepad = FindWindow(_T("Notepad"), NULL);
HWND edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL);
SendMessage(edit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));
nếu bạn cần mã phím và tổ hợp phím tùy ý, bạn có thể sử dụng SendInput()
(có sẵn trong 2k/xp và ưa thích) hoặc keybd_event()
`(mà sẽ kết thúc gọi SendInput trong phiên bản mới hơn OSS) một số ví dụ ở đây:
http://www.codeguru.com/forum/showthread.php?t=377393
có cũng WM_SYSCOMMAND/WM_KEYDOWN/WM_KEYUP/WM_CHAR sự kiện Sen dMessage mà bạn có thể quan tâm.
keybd_event() đã được thay thế bằng SendInput(), vì vậy tốt nhất nên sử dụng điều đó. Dưới đây là một số mã ví dụ để làm những gì bạn đã yêu cầu. Bạn có thể chỉnh sửa trực tiếp điều khiển chỉnh sửa của cửa sổ Notepad bằng cách sử dụng SendMessage(), hoặc bạn có thể sử dụng SendInput() để tổng hợp các tổ hợp phím được gửi đến cửa sổ.
Sử dụng SendInput()
:
int SendKeystrokesToNotepad(const TCHAR *const text)
{
INPUT *keystroke;
UINT i, character_count, keystrokes_to_send, keystrokes_sent;
HWND notepad;
assert(text != NULL);
//Get the handle of the Notepad window.
notepad = FindWindow(_T("Notepad"), NULL);
if(notepad == NULL)
return 0;
//Bring the Notepad window to the front.
if(!SetForegroundWindow(notepad))
return 0;
//Fill in the array of keystrokes to send.
character_count = _tcslen(text);
keystrokes_to_send = character_count * 2;
keystroke = new INPUT[ keystrokes_to_send ];
for(i = 0; i < character_count; ++i)
{
keystroke[ i * 2 ].type = INPUT_KEYBOARD;
keystroke[ i * 2 ].ki.wVk = 0;
keystroke[ i * 2 ].ki.wScan = text[ i ];
keystroke[ i * 2 ].ki.dwFlags = KEYEVENTF_UNICODE;
keystroke[ i * 2 ].ki.time = 0;
keystroke[ i * 2 ].ki.dwExtraInfo = GetMessageExtraInfo();
keystroke[ i * 2 + 1 ].type = INPUT_KEYBOARD;
keystroke[ i * 2 + 1 ].ki.wVk = 0;
keystroke[ i * 2 + 1 ].ki.wScan = text[ i ];
keystroke[ i * 2 + 1 ].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
keystroke[ i * 2 + 1 ].ki.time = 0;
keystroke[ i * 2 + 1 ].ki.dwExtraInfo = GetMessageExtraInfo();
}
//Send the keystrokes.
keystrokes_sent = SendInput((UINT)keystrokes_to_send, keystroke, sizeof(*keystroke));
delete [] keystroke;
return keystrokes_sent == keystrokes_to_send;
}
Sử dụng SendMessage()
:
int SendKeystrokesToNotepad(const TCHAR *const text)
{
HWND notepad, edit;
assert(text != NULL);
//Get the handle of the Notepad window.
notepad = FindWindow(_T("Notepad"), NULL);
if(notepad == NULL)
return 0;
//Get the handle of the Notepad window's edit control.
edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL);
if(edit == NULL)
return 0;
SendMessage(edit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)text);
return 1;
}
Tôi hy vọng rằng sẽ giúp.
Hiện tại, trong bản đồ ngoại lệ SendInput(), KEYEVENTF_UNICODE có quan tâm đến loại văn bản, có thể là một char không? Tôi thấy không có KEYEVENTF_SCANCODE nhưng bạn đặt nhân vật của bạn trong wScan. GetMessageExtraInfo() có cần thiết không? – ManuelSchneid3r
@DevNoob: Không, điều này sẽ hoạt động đối với cả bản dựng Unicode và không phải Unicode. (Tôi vừa thử nghiệm nó.) Có, GetMessageExtraInfo() _appears_ là cần thiết vì tài liệu chỉ ra rằng nó được yêu cầu. Bằng cách này, các câu trả lời cho câu hỏi của bạn cũng có thể được tìm thấy bằng cách đọc tài liệu MSDN cho các chức năng tương ứng và các loại bằng cách sử dụng liên kết trong câu trả lời của tôi. – Sam
@DevNoob, tôi không hoàn toàn chắc chắn ý của bạn về 'KEYEVENTF_KEYUP' bị bỏ qua. Tôi cũng không chắc chắn những gì bạn có ý nghĩa về một phần của tài liệu bạn trích dẫn. Nếu bạn đang băn khoăn tại sao cả hai sự kiện bàn phím và khóa bàn phím đều được yêu cầu, đó là vì chúng được sử dụng để tạo ra các thông báo cửa sổ WM_KEYDOWN và 'WM_KEYUP' tương ứng cho cửa sổ đích. Chúng tôi đang làm việc trên một mức độ thấp, và tôi không nghĩ rằng Windows API cung cấp một thông điệp 'WM_KEYPRESS' để đại diện cho một khóa duy nhất _press_. – Sam
- 1. Gửi trực tiếp các lần nhấn phím đến một quy trình khác qua hooking
- 2. Gửi bằng cách nhấn enter ở dạng cửa sổ
- 3. Có cách nào để gửi các lần nhấn phím tới Webkit bằng Capybara không?
- 4. Một chức năng gọi lại mỗi lần nhấn một phím (bất kể cửa sổ nào có tiêu điểm)?
- 5. Làm cách nào để xử lý các lần nhấn phím đồng thời trong Java?
- 6. Làm cách nào để thoát trình chỉnh sửa Vi bằng một lần nhấn phím?
- 7. Làm thế nào để chuyển đổi một phím nhập Nhấn vào một phím Tab Bấm cho các trang web
- 8. Cách đóng cửa sổ Tkinter bằng cách nhấn một nút?
- 9. Có cách HTML sạch để liên kết một lần nhấn phím đến một mục thả xuống
- 10. Làm cách nào để nhúng WebKit vào cửa sổ?
- 11. Làm thế nào để chờ một lần nhấn phím trong R?
- 12. Độ trễ trung bình từ các lần nhấn phím
- 13. C# Gửi đầu vào bàn phím
- 14. Làm cách nào để gắn các cửa sổ con vào cửa sổ mẹ ở các vị trí tương đối?
- 15. Làm cách nào để tối thiểu hóa các lần nhấn phím trong khi chèn các dòng tương tự trong vim?
- 16. Làm cách nào để chỉ định hành vi 'Đóng khi nhấn phím Escape' cho tất cả các cửa sổ WPF trong một dự án?
- 17. Sử dụng pyhook để trả lời cho tổ hợp phím (không chỉ một lần nhấn phím)?
- 18. Làm cách nào để tạo các lệnh di chuyển cửa sổ bỏ qua một cửa sổ nhất định?
- 19. Làm cách nào để gửi biểu mẫu chỉ một lần sau khi nhấp vào nhiều lần gửi?
- 20. Làm cách nào để gửi một cửa sổ WPF về phía sau?
- 21. Làm cách nào để tắt tính năng tự động gửi khi nhấn phím enter?
- 22. Làm cách nào để tạo cửa sổ bật lên trong Tkinter khi nhấn nút?
- 23. Làm cách nào để tập trung vào điều khiển trong các hình thức cửa sổ
- 24. Làm cách nào để đóng các cửa sổ có thể gắn kết của Visual Studio bằng bàn phím?
- 25. Làm cách nào để chuyển dữ liệu vào cửa sổ cha mẹ từ cửa sổ bật lên?
- 26. Chụp một phím nhấn trên nền
- 27. Gửi một số phím đến cửa sổ không hoạt động với trăn
- 28. C# Gửi lệnh bàn phím đến một cửa sổ/quy trình khác
- 29. Làm cách nào để mô phỏng sự kiện nhấn phím giả mạo trong Haskell?
- 30. Làm thế nào tôi có thể xử lý một phím tắt trong mọi cửa sổ WPF?
Làm thế nào để gửi nó vào một cửa sổ? – H4cKL0rD
Không. Bạn cần phải vượt qua một tay cầm cửa sổ trong tham số 'hWnd'. Ngoài ra, xử lý cửa sổ là tham số * đầu tiên *, không phải là tham số thứ ba. –
Bạn không thể sử dụng SendMessage() để gửi tổ hợp phím. Bạn không thể kiểm soát trạng thái bàn phím. Đặc biệt là các phím Shift, Control và Alt. –