回 帖 发 新 帖 刷新版面

主题:[讨论]使用API的SendMessage發送訊息到計算機

各位前輩大家好~
小弟有個問題困擾很久,在台灣的論壇找不到答案,所以到這裡來求救..
我想要在VFP中使用API的SendMessage控制WINDOWS的計算機程式..
可否請前輩們指導一下~
我使用如下的程式碼~但是因為不了解SendMessage的用法,所以一直沒有成功
DECLARE INTEGER SendMessage IN user32 INTEGER hWnd,Long Msg,INTEGER wParam,String lParam
SendMessage(1247226,12,6,"789")

以上~是要送一個789的數字到計算機,請問我該怎麼做呢??
拜託各位了~謝謝~

回复列表 (共6个回复)

沙发


台灣的顶一下啦!
我想你那个sendmessage 是接受一个外部的参数,然后要将这个参数传递到VFP的程序中,所以应该是找到VFP的接受外部参数的函数,这个函数是啥?还望高手指点啦,找到了应该能解决问题了

板凳

眤~

EM_REPLACESEL = 0xC2
SendMg='369'
Declare Integer SendMessage In user32 Integer,Integer,Integer,String @
SendMessage(4352,EM_REPLACESEL,0,SendMg)

4352琌掸癘セ琡琌ノ...
Declare Long FindWindowEx In user32.dll Long, Long, String, Strin
┮眔
祘Α琌盢369恶癘ㄆセい琌璸衡诀и碞ぃ笵赣或恶~临琌тぃ

ぃ筁~临琌稰谅眤闽み稰縀ぃ荷谅谅~~~

3 楼

1楼理解有误.
应该要像2楼所说的先用FindWindow获取句柄.
因为用得少,具体用法搞不清楚.
好像获取窗口句柄还不行,还需要子窗口的句柄.

用VBS就比较简单:

ws=CREATEOBJECT("Wscript.shell")
ws.AppActivate("计算器")
ws.SendKeys ("789")

4 楼

感謝moz大大~

我另外有用FindWindowx取得子窗口的句柄,所以這部份是沒有問題的,因為程式還在整理,所以無法貼上來~
ws=CREATEOBJECT("Wscript.shell")
ws.AppActivate("计算器")
ws.SendKeys ("789")
這樣的方式需要計算器在頂層窗口才能使用..

而我是希望計算不需要在頂層窗口,主要是我也想要控制 IE 中的input控件的輸入,所以先以計算器來測試
若以SendMessage來處理的話,那麼不管哪一種應用程式都不需要成為頂層窗口就都可以執行。

不好意思哦~沒有表達清楚~抱歉~

5 楼

在我的印象里面,要控制浏览器里的输入控件,
应该先去学习下XML,CSS之类的层结构,
使用SendMessage估计会出现好多意外.


t1=CreateOBJECT("InternetExplorer.Application")
t1.Navigate("www.163.com")
后面的对象怎么引用,忘了

6 楼

这是c#的代码,用法是一样的,可以参考下:
“//”为c#注释符号


private const int WM_SETTEXT = 0x000C;  // 在vfp命令窗口中可以用 ?0x000C 查看具体值
//这是定义api函数
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(
    string lpClassName,
    string lpWindowName);

[DllImport("User32.dll")]
private static extern IntPtr FindWindowEx(
    IntPtr hwndParent,
    IntPtr hwndChildAfter,
    string lpszClass,
string lpszWindows);
[DllImport("User32.dll")]
private static extern Int32 SendMessage(
    IntPtr hWnd,               
    int Msg,                
    IntPtr wParam,             
StringBuilder lParam);
private void button1_Click(object sender, EventArgs e)
{
    // 返回写字板主窗口句柄
    IntPtr hWnd = FindWindow("Notepad", "Untitled - Notepad");
    if (!hWnd.Equals(IntPtr.Zero))
    {
        //返回写字板编辑窗口句柄
        IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null);
        if (!edithWnd.Equals(IntPtr.Zero))  //如果返回的句柄不为0或空就继续
            // 发送WM_SETTEXT 消息: "Hello World!"
            SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World!"));  //new StringBuilder("Hello World!")vfp中可以直接用字符串代替
    }
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册