父页面得到子页面的值

本文介绍了一个简单的父页面打开子页面并通过JavaScript进行页面间数据传递的示例。父页面通过弹窗方式打开子页面,并定义了窗口大小及位置。子页面则通过AJAX调用获取数据并将其写回父页面指定元素中。

父页面打开子页面JS

    function ScanTypeSelect() {

        var iWidth = 300;                          //弹出窗口的宽度; 
        var iHeight = 200;                         //弹出窗口的高度; 
        //获得窗口的垂直位置 
        var iTop = (window.screen.availHeight - 30 - iHeight) / 2;
        //获得窗口的水平位置 
        var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;


        var url = "/Order/ScanTypeSelect"
        window.open(url, 'newwindow', 'height=' + iHeight + ',width=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ', toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
 

    }

父页面HTML

<body>

<input type="text" id="txtTest"/>

</body>


子页面JS 其中data就是写入到父页面的值。

    function GetScanTypeString() { 
        $.post("/Order/GetScanTypeString", {}, function (data) {
           // alert(data) 
            window.opener.document.getElementById("txtTest").innerHTML = data 
            window.close()
        });
    }


<think>好的,用户的问题是关于如何在Windows中使用PostMessage实现父页面页面传递参数的示例。我需要先理解PostMessage的基本用法和相关参数。根据用户提供的引用内容,特别是引用[1]中的函数原型,PostMessage需要目标窗口的句柄(hWnd)、消息类型(Msg)、以及wParam和lParam参数。 接下来,用户提到的是父页面页面之间的参数传递,这应该是在Web浏览器环境中的跨窗口通信,例如使用iframe或者新窗口打开的页面。根据引用[2]、[3]、[4],跨域通信可以使用window.postMessage方法,但这里用户特别询问的是Windows中的PostMessage,可能指的是Windows API而不是Web的postMessage。不过,用户提供的引用中既有Windows API的PostMessage,也有Web的postMessage,需要仔细辨别。 用户可能混淆了Windows API的PostMessage和Web的window.postMessage。根据问题描述,用户想了解的是Windows应用程序中的窗口间消息传递,而不是Web页面的跨域通信。因此,应该以Windows API的PostMessage为例来回答。 需要确认如何获取页面的窗口句柄(hWnd)。在Windows应用程序中,父窗口和窗口通常是通过CreateWindow或类似的API创建的,窗口的句柄由父窗口保存。例如,在C++中,创建窗口时会得到其句柄,父窗口可以使用该句柄通过PostMessage发送消息。 然后,消息类型Msg需要自定义,通常使用WM_USER + n的形式来避免与系统消息冲突。wParam和lParam参数可以传递指针或整数,但需要注意线程安全,因为PostMessage是异步的,数据需要在接收方处理时仍然有效。 另外,窗口的消息处理函数(如WndProc)需要处理自定义的消息,提取参数并进行相应操作。 需要提供一个具体的示例代码,可能用C++或C#,因为它们是常用的Windows开发语言。用户可能需要代码示例来理解如何实现。 同时,用户提供的引用中有关于Web的postMessage的内容,但问题明确提到Windows中的PostMessage,因此需要区分开来,避免混淆。可能需要提醒用户注意两者的不同,避免误用。 总结步骤: 1. 获取窗口的句柄hWnd。 2. 定义自定义消息,例如WM_CUSTOM_MESSAGE。 3. 使用PostMessage发送消息,传递参数。 4. 窗口处理消息,提取参数。 需要注意线程间通信的问题,如果父窗口和窗口属于不同线程,需要确保数据传递的安全性,例如使用SendMessage而不是PostMessage,或者复制数据到接收方。 最后,生成相关问题,帮助用户进一步学习,如参数传递的限制、PostMessage与SendMessage的区别等。</think>### 分步解答:使用Windows API的PostMessage实现父窗口向窗口传参 #### 1. 核心原理 Windows API的`PostMessage`函数通过窗口句柄($hWnd$)向指定窗口发送消息,传递参数时使用$wParam$和$lParam$两个参数。消息类型需自定义(例如`WM_USER + 1`),窗口需在消息处理函数中解析参数[^1]。 #### 2. 实现步骤 **步骤1:定义自定义消息** ```cpp #define WM_CUSTOM_MESSAGE (WM_USER + 0x100) // 自定义消息类型 ``` **步骤2:父窗口发送消息** ```cpp // 假设hChildWnd是窗口句柄(通过CreateWindow获取) LPARAM lParam = (LPARAM)"Hello from Parent"; // 传递字符串参数 PostMessage(hChildWnd, WM_CUSTOM_MESSAGE, 0, lParam); ``` *注:若传递指针,需确保数据在接收时有效(如同一线程或使用内存拷贝)* **步骤3:窗口处理消息** 在窗口的窗口过程函数中处理: ```cpp LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CUSTOM_MESSAGE: const char* str = (const char*)lParam; // 提取参数 MessageBox(hWnd, str, "Received", MB_OK); return 0; // 其他消息处理... } return DefWindowProc(hWnd, msg, wParam, lParam); } ``` #### 3. 完整示例(C++) ```cpp // 父窗口创建窗口并发送消息 HWND hChild = CreateWindow(..., "ChildClass", ..., NULL); PostMessage(hChild, WM_CUSTOM_MESSAGE, 0, (LPARAM)"Parameters"); // 窗口注册及消息处理 WNDCLASS wc = {}; wc.lpfnWndProc = ChildWndProc; wc.lpszClassName = "ChildClass"; RegisterClass(&wc); ``` #### 4. 关键注意事项 1. **线程安全**:若跨线程通信,使用`SendMessage`替代`PostMessage`以保证同步 2. **参数类型**:$lParam$可传递指针/句柄,但需确保接收方生命周期内有效 3. **消息范围**:自定义消息需在`WM_USER`到`0x7FFF`之间 ```mermaid graph LR A[父窗口获取窗口句柄] --> B[PostMessage发送WM_CUSTOM] B --> C[窗口消息队列接收消息] C --> D[ChildWndProc解析lParam/wParam] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值