如何模拟点击一个非当前窗口的外部程序的按钮,打开一个对话框,在对话框中输入字符串,并模拟点击对话框的“打开”按钮? 这个问题太复杂了~~~楼主可以尝试使用注入,注入程序去调用TranslateMessage函数。另外你最好到VC板块去问问.net里面做这方面的人比较少 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以给伴水发消息他Delphi比较牛应该做过类似的 lovefootball(蟑螂(生活就是扯淡--做人要放低姿态)) :谢谢你的答复?注入程序从来没有接触过,需要哪些相关背景知识吗? http://blog.csdn.net/NicX/archive/2007/08/02/1721980.aspx看看这个 注入程序好像很难哪!如果非当前窗口状态实现不了的话,使用以下两个函数:void SetWindowToTopMost(int _mainWindowHandle) { SetWindowPos(_mainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } void CancelWindowTopMost(int _mainWindowHandle) { SetWindowPos(_mainWindowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); }来实现将非当前窗口设置为当前窗口。那么需要解决的一个问题是,在实现功能时必须排除键盘和鼠标输入的干扰。之前使用://启动鼠标和键盘锁定 this.EnableKeyBoardCapture(); this.EnableMouseCapture();这段代码却没有把键盘、鼠标锁定,那如何才能锁定键盘、鼠标,又不影响SendMessage的使用? 这不就是反射吗有点自动化测试的意思using System.Reflection; virusplayer() ,能说详细一点吗?mtsatDealProgram这个外部程序是用VC++写的。 如果你允许激活窗口的话屏蔽鼠标http://asp2net.net/Article/bianchengwenda/C/2007-5-28/2007052823264120.html屏蔽键盘http://topic.csdn.net/t/20020325/22/599562.html 那就要用SPY++看看它的层次结构然后初始化它,调用它 利用底层键盘钩子屏蔽任意按键http://blog.csdn.net/goodname008/archive/2004/08/21/80827.aspx using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Diagnostics;using System.Reflection;namespace 鼠标键盘钩子实例{ public partial class Form1 : Form { #region 锁定鼠标和键盘 //有关鼠标和键盘钩子的相关定义 static int hhookMouse = 0; static int hhookKeyBoard = 0; public const int WH_MOUSE_LL = 14; private const int WH_KEYBOARD_LL = 13; public const int HC_ACTION = 0; public delegate int HookProc(int nCode, IntPtr wParam, IntPtr iParam); HookProc MouseHookProcedure, KeyBoardHookProcedure; [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hinstance, int threadid); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); /// <summary> /// 钩子处理方法(鼠标锁定) /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { //如果nCode<0,直接调用CallNextHookEx返回 if (nCode < 0) //return CallNextHookEx(hhookMouse,nCode,wParam,lParam); return 1; //函数将消息向下传递,下一个钩子处理将截获这一消息 //if(nCode!= HC_ACTION) // return CallNextHookEx(hhookMouse, nCode, wParam, lParam); return 1; } /// <summary> /// 启动鼠标锁定 /// </summary> /// <returns></returns> private bool EnableMouseCapture() { MouseHookProcedure = new HookProc(this.MouseHookProc); Process currentProcess = Process.GetCurrentProcess(); //安装全局鼠标钩子 hhookMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, currentProcess.MainModule.BaseAddress, 0); if (hhookMouse == 0) return false; return true; } /// <summary> /// 解除鼠标锁定 /// </summary> /// <returns></returns> private bool DisableMouseCapture() { return UnhookWindowsHookEx(hhookMouse); } /// <summary> /// 钩子处理方法(键盘锁定) /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> private int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam) { //如果nCode<0,直接调用CallNextHookEx返回 if (nCode < 0) return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam); //return 1; //函数将消息向下传递,下一个钩子处理将截获这一消息 if (nCode != HC_ACTION) return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam); return 1; } /// <summary> /// 启动键盘锁定 /// </summary> /// <returns></returns> private bool EnableKeyBoardCapture() { KeyBoardHookProcedure = new HookProc(this.KeyBoardHookProc); Process currentProcess = Process.GetCurrentProcess(); //安装全局键盘钩子 hhookKeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, currentProcess.MainModule.BaseAddress, 0); if (hhookKeyBoard == 0) return false; return true; } /// <summary> /// 解除键盘锁定 /// </summary> /// <returns></returns> private bool DisableKeyBoardCapture() { return UnhookWindowsHookEx(hhookKeyBoard); } #endregion public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { EnableKeyBoardCapture(); EnableMouseCapture(); } }}各位,上面这段代码单独试验过了,可行。但是把它合并到我的程序当中去就不行,具体表现在EnableMouseCapture()后,不能锁死鼠标,移动鼠标时,鼠标还是能跳跃式移动,但移动非常缓慢,不能完全锁死鼠标。 同时锁死鼠标后,对我的程序有影响,表现在PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0));不能起作用了。难道说通过PostMessage发送的BM_CLICK消息也被当作实体鼠标消息截获了? 这几天都没人来看看吗?看来我的问题是很难都能解决了!唉!问题3、在将while (!PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0)) { Thread.Sleep(100); }处改用int lResult = SendMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0);时,能够打开“打开”对话框,但程序无法执行下去,也即lResult无法获得返回值,只有手动将“打开”对话框关闭时,程序才能执行下去,但也就无法实现程序功能了!这个问题有人知道是怎么回事吗?我猜可能是SendMessage需要一个结果才能返回导致程序执行不下去,那是不是要对“打开”对话框进行某项操作才能使SendMessage有结果呢?! excel作为数据库 关于DATASET的copy问题 数据库问题 在C#下使用类似与mfc下的ole功能(就这些分了,全都送) 有什么好的类设计辅助软件吗 在c#中可以启动非.exe或.com文件吗?如何启动? 双缓冲 水晶报表的页脚如何根据详细资料的内容改变?? 高分:如何获得一个数据集其中一个表的字段,及其内容?不胜感激! 如何绘制有阴影的圆形按钮? 有人用过ChilkatDotNet.dll没... 关于C#文件的读取~~~自定义文件格式~~~
他Delphi比较牛
应该做过类似的
谢谢你的答复?注入程序从来没有接触过,需要哪些相关背景知识吗?
看看这个
如果非当前窗口状态实现不了的话,使用以下两个函数:
void SetWindowToTopMost(int _mainWindowHandle)
{
SetWindowPos(_mainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
void CancelWindowTopMost(int _mainWindowHandle)
{
SetWindowPos(_mainWindowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
来实现将非当前窗口设置为当前窗口。那么需要解决的一个问题是,在实现功能时必须排除键盘和鼠标输入的干扰。之前使用:
//启动鼠标和键盘锁定
this.EnableKeyBoardCapture();
this.EnableMouseCapture();
这段代码却没有把键盘、鼠标锁定,那如何才能锁定键盘、鼠标,又不影响SendMessage的使用?
有点自动化测试的意思
using System.Reflection;
http://asp2net.net/Article/bianchengwenda/C/2007-5-28/2007052823264120.html
屏蔽键盘
http://topic.csdn.net/t/20020325/22/599562.html
然后初始化它,调用它
http://blog.csdn.net/goodname008/archive/2004/08/21/80827.aspx
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Reflection;namespace 鼠标键盘钩子实例
{
public partial class Form1 : Form
{
#region 锁定鼠标和键盘
//有关鼠标和键盘钩子的相关定义
static int hhookMouse = 0;
static int hhookKeyBoard = 0;
public const int WH_MOUSE_LL = 14;
private const int WH_KEYBOARD_LL = 13;
public const int HC_ACTION = 0;
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr iParam);
HookProc MouseHookProcedure, KeyBoardHookProcedure;
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hinstance, int threadid);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
/// <summary>
/// 钩子处理方法(鼠标锁定)
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//如果nCode<0,直接调用CallNextHookEx返回
if (nCode < 0)
//return CallNextHookEx(hhookMouse,nCode,wParam,lParam);
return 1;
//函数将消息向下传递,下一个钩子处理将截获这一消息
//if(nCode!= HC_ACTION)
// return CallNextHookEx(hhookMouse, nCode, wParam, lParam);
return 1;
}
/// <summary>
/// 启动鼠标锁定
/// </summary>
/// <returns></returns>
private bool EnableMouseCapture()
{
MouseHookProcedure = new HookProc(this.MouseHookProc);
Process currentProcess = Process.GetCurrentProcess(); //安装全局鼠标钩子
hhookMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, currentProcess.MainModule.BaseAddress, 0);
if (hhookMouse == 0)
return false;
return true;
}
/// <summary>
/// 解除鼠标锁定
/// </summary>
/// <returns></returns>
private bool DisableMouseCapture()
{
return UnhookWindowsHookEx(hhookMouse);
} /// <summary>
/// 钩子处理方法(键盘锁定)
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//如果nCode<0,直接调用CallNextHookEx返回
if (nCode < 0)
return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
//return 1;
//函数将消息向下传递,下一个钩子处理将截获这一消息
if (nCode != HC_ACTION)
return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
return 1;
}
/// <summary>
/// 启动键盘锁定
/// </summary>
/// <returns></returns>
private bool EnableKeyBoardCapture()
{
KeyBoardHookProcedure = new HookProc(this.KeyBoardHookProc);
Process currentProcess = Process.GetCurrentProcess();
//安装全局键盘钩子
hhookKeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, currentProcess.MainModule.BaseAddress, 0);
if (hhookKeyBoard == 0)
return false;
return true;
}
/// <summary>
/// 解除键盘锁定
/// </summary>
/// <returns></returns>
private bool DisableKeyBoardCapture()
{
return UnhookWindowsHookEx(hhookKeyBoard);
} #endregion
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
EnableKeyBoardCapture();
EnableMouseCapture();
}
}
}各位,上面这段代码单独试验过了,可行。但是把它合并到我的程序当中去就不行,具体表现在EnableMouseCapture()后,不能锁死鼠标,移动鼠标时,鼠标还是能跳跃式移动,但移动非常缓慢,不能完全锁死鼠标。
看来我的问题是很难都能解决了!唉!问题3、在将
while (!PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0))
{
Thread.Sleep(100);
}
处改用int lResult = SendMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0);
时,能够打开“打开”对话框,但程序无法执行下去,也即lResult无法获得返回值,只有手动将“打开”对话框关闭时,程序才能执行下去,但也就无法实现程序功能了!这个问题有人知道是怎么回事吗?
我猜可能是SendMessage需要一个结果才能返回导致程序执行不下去,那是不是要对“打开”对话框进行某项操作才能使SendMessage有结果呢?!