Joa*_*ira 7 c# postmessage keypress handler sendmessage
我需要在第三方应用程序中模拟按键.假设我有一个需要向Calculator应用程序发送"8"的C#应用程序.我不能使用.Net的SendKeys或win32 api的keybd_event,因为它们都要求窗口是最活跃的窗口,这在我的情况下不是这种情况.
这样我就可以调用sendMessage和postMessage.我在过去的三个小时里一直试图获得一些结果,但现在我完全没有希望了.
我有以下内容:
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);
private void button1_Click(object sender, EventArgs e)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSCOMMAND = 0x018;
const int SC_CLOSE = 0x053;
int WindowToFind = FindWindow(null,"Calculator");
int result = SendMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
Boolean result2 = PostMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
int result3 = SendMessage(WindowToFind, WM_KEYDOWN,((int)Keys.NumPad7), 0);
Boolean result4 = PostMessage(WindowToFind, WM_KEYDOWN, ((int)Keys.NumPad7), 0);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我尝试四次与计算器进行通信.使用sendMessage和PostMessage来关闭窗口并发送密钥7.没有任何作用.FindWindow方法的工作原因是我得到了应用程序的处理程序(我甚至尝试自己启动进程并使用process.MainWindowHandler访问它,但没有运气).没有错误或例外,但它在Calculator中没有任何作用.
我也用记事本尝试了完全相同的东西,也没有任何改变.
Jon*_*upp 12
你有机会在64位机器上运行吗?如果是这样,我相信所有那些实际上是hWnds的'int'值(发送/发布的第一个参数,从FindWindow返回值)需要是IntPtr.
经过多次检查后,看起来对于SendMessage和PostMessage,第1,第3和第4个参数应该是IntPtr而不是int(以及所有这些参数的返回值)
所以,正确的签名将是:
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
Run Code Online (Sandbox Code Playgroud)