1

我正在使用以下 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);
4

1 回答 1

1

WM_PASTE 消息不使用参数。这只是指示收件人获取剪贴板的内容并粘贴它们。因此,如果您希望收件人做任何事情,您需要先填充剪贴板。

如果您不想污染剪贴板,并且您不应该因为它属于用户,那么您可以发送一个 EM_REPLACESEL 消息传递 lParam 中的文本。

如果要查找用户当前正在处理的窗口,请使用 GetForegroundWindow。

然而,与其伪造低级消息,最好的办法是使用自动化 API。

于 2013-06-23T13:41:37.493 回答