2011-01-13 47 views
5

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.

+1

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 đó. –

Trả lời

2

Bạn có thể tìm ra số lpszClass của chương trình bằng cách sử dụng công cụ kiểm tra chẳng hạn như WinSpy++. Nó cung cấp cho bạn một crosshair mà bạn có thể kéo và vị trí trên điều khiển mong muốn. Điều này đã có thể dễ dàng cung cấp cho tôi với tên lớp "chỉnh sửa" cho notepad.

Nếu mọi thứ không hoạt động, hãy nhấp vào nút "Thêm >>" ở phía dưới bên phải của WinSpy ++, sau đó nhấp vào nút "Xác định vị trí" để xem hệ thống phân cấp điều khiển; bạn có thể cần phải gửi tin nhắn WM_KEYDOWN đến một trong các điều khiển cha hoặc con thay vào đó.

3

Tôi nghĩ bạn cần có chương trình nền cài đặt móc nối bàn phím mức thấp thông qua hàm win32 SetWindowsHookEx().

Dưới đây là tài liệu MSDN cho SetWindowsHookEx()

http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

Và đây là bài viết KB về cách để làm điều đó từ C#

http://support.microsoft.com/kb/318804

Bài viết này đi vào một số chi tiết, quá : http://www.codeguru.com/columns/vb/article.php/c4829

Tôi hy vọng ứng dụng của bạn sẽ nhận được caug ht bởi phần mềm gián điệp/chống vi-rút khác nhau như một trình ghi bàn phím, mặc dù.

Chúc may mắn.

+0

Điều này sẽ yêu cầu khả năng sửa đổi chương trình khác, phải không?Trong trường hợp đó, anh ta sẽ tốt hơn khi cung cấp một API sạch ở nơi đầu tiên để làm bất cứ điều gì anh ta cần, thay vì hack như gửi thông điệp báo chí chính hoặc móc cấp thấp. – Justin

Các vấn đề liên quan