Tôi muốn gửi đột quỵ chính cho một chương trình ngay cả khi chương trình đang chạy ở chế độ nền. Nhưng tôi có thể làm điều này chỉ cho NOTEPAD như thế này,Gửi tổ hợp phím đến một chương trình ngay cả khi đang ở chế độ nền bằng C#
[DllImport("user32.dll")]
protected static extern byte VkKeyScan(char ch);
[DllImport("user32.dll", SetLastError = true)]
protected static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
protected static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
char Key = // key value to send
IntPtr hWnd = FindWindowEx(_handle, IntPtr.Zero, "edit", null); // _handle is the windows handle of the program (here its notepad)
PostMessage(hWnd, WM_KEYDOWN, VkKeyScan(Key), 0);
Nhưng đối với tất cả các ứng dụng khác mà tôi không thể gửi tổ hợp phím nếu trong mình nền. Vì tôi không biết lpszClass
của chương trình đó (Tôi nghĩ đây là tên userControl của khu vực đánh máy trong chương trình đó. Đối với NotePad nó là "edit"
. Tôi thấy internet lướt này).
Đối với tất cả các ứng dụng khác những gì tôi đang làm là, đưa ứng dụng lên nền trước, sau đó gửi khóa, sau đó lại nhận được tiền cảnh chương trình của tôi. Tôi cần chương trình của tôi để chạy như tiền cảnh luôn.
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
SetForegroundWindow(_handle); // _handle is the windows handle of the program
System.Threading.Thread.Sleep(50); // Waiting few milliseconds till application coming to foreground.
wsh.SendKeys(Key.ToString(), ref wait); // wsh is WshShellClass wsh= new WshShellClass();
SetForegroundWindow(_mainHandle); // _mainHandle is the windows handle of my application
Nhưng cách này không hoạt động. một số phím bị nhỡ và chương trình nền trước-> nền-> foregound-> nền ...... giống như điệu nhảy của nó ...
Cách gửi chìa khóa cho các ứng dụng khác nếu chạy ở chế độ nền. hoặc có cách nào/nguồn để tìm lpszClass
của một chương trình không?
Xin lỗi nếu tôi đã bỏ lỡ bất kỳ thông tin bắt buộc nào. đây là một ứng dụng lớn. Tôi chỉ đăng những phần bắt buộc ở đây. Nếu ai đó cần bất kỳ thông tin bổ sung, xin hỏi.
Hàng trăm câu hỏi về vấn đề này tại SO, không chắc chắn cách bạn bỏ lỡ chúng. Dù bạn làm gì để tập trung quay lại, đừng làm điều đó. –