2013-06-23 71 views
0

我正在使用以下SendMessage函數將文本發送/粘貼到其他應用程序。 但是在這個函數中,我必須給出另一個應用程序的窗口名稱。如何使用SendMessage將某些內容粘貼到其他窗口

我怎樣才能改變這個獲得當前活動窗口並粘貼在代碼中?

代碼:

[DllImport("user32.dll")] 
public static extern int SendMessage(int hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam); 

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

public const int WM_PASTE = 0x0302; 

IntPtr windowHandle = FindWindow("NOTEPAD", null); 
IntPtr editHandle = FindWindowEx(windowHandle, IntPtr.Zero, "EDIT", null); 
string textToSendToFile = "Input here your text"; 
Clipboard.SetText("Test"); 
SendMessage((int)editHandle, WM_PASTE, 0, textToSendToFile); 

我也得到了這一點,但我真的不知道如何將它與上面的代碼結合在一起......

[DllImportAttribute("user32.dll", EntryPoint = "GetForegroundWindow")] 
public static extern IntPtr GetForegroundWindow(); 

[DllImportAttribute("user32.dll", EntryPoint = "GetWindowThreadProcessId")] 
public static extern uint GetWindowThreadProcessId([InAttribute()] IntPtr hWnd, IntPtr lpdwProcessId); 

IntPtr hWndForegroundWindow = GetForegroundWindow(); 
uint activeThreadID = GetWindowThreadProcessId(hWndForegroundWindow, IntPtr.Zero); 

回答

1

的WM_PASTE消息不使用的參數。這只是一個指示收件人採取剪貼板的內容並粘貼它們。所以如果你希望收件人做任何事情,你需要先填充剪貼板。

如果你不想污染剪貼板,並且你不應該因爲它屬於用戶,那麼你可以發送一個EM_REPLACESEL消息傳遞lParam中的文本。

如果您想查找用戶當前正在處理的窗口,請使用GetForegroundWindow。

但是,不是僞造低級消息,最重要的是使用自動化API。

+0

也許我解釋了我的問題,對不起。因爲如果你有一個開放的記事本,上面的代碼已經工作。但我喜歡得到它與任何打開的窗口(當前窗口),而不是隻用記事本工作... 我喜歡有一個小應用程序在後臺運行,如果你按快捷鍵,它應該粘貼一些文字在活動窗口。 – Simon

+0

我在解釋你對WM_PASTE的使用不正確。您正在尋找的窗口是GetForegroundWindow。但自動化API是你真正想要的。 –

相關問題