如何使用 sendmessage 发送 win32 中具有计时器过程的 wm_timer

2024-02-24

我有一个计时器,ID 1,它有一个timerproc作为回调函数。

我正在 timeproc 中制作其他计时器(ID 2, 3, ...),它们使用WM_TIMER事件,而不是另一个计时器进程。

创建窗口时,我想立即生成定时器事件,ID 1。

所以我像这样使用了SendMessage函数

SendMessage(hWnd, WM_TIMER, 1, (LPARAM)&timerproc);

但它不起作用。

如何在窗口第一次启动时激活timerproc?

void CALLBACK MakeRain(HWND hWnd, UINT iMessage, UINT_PTR wParam, DWORD lParam) 
{ /* this is timerproc for ID 1 */
    if (gRdx >= MAX_WORDS_COUNT) return;

    gRain[gRdx].f = 1;
    gRain[gRdx].x = rand() % (gRect.right - 30);
    gRain[gRdx].y = 10;

    int id = RdxToTID(gRdx);
    int vel = rand() % 2000 + 1000;
    SetTimer(hWnd, id, vel, NULL);    /* In here I am making other timers */
    gRdx++;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
        int tid = wParam;
        int rdx = TIDToRdx(tid);

        switch (iMessage)
        {
        case WM_CREATE:
            GetClientRect(hWnd, &gRect);
            srand((unsigned int)time(NULL));
            SetTimer(hWnd, 1, MAKE_RAIN_TERM, MakeRain);
            /* my trying, It is not working */
            //SendMessage(hWnd, WM_TIMER, 1, (LPARAM)&MakeRain);
            return 0;
        case WM_TIMER:
            gRain[rdx].y += 10;
            if (gRain[rdx].y >= gRect.bottom) {
                gRain[rdx].f = 0;
                KillTimer(hWnd, tid);
            }
            InvalidateRect(hWnd, NULL, TRUE);
            return 0;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            for (int i = 0; i < MAX_WORDS_COUNT; i++) {
                if (gRain[i].f == 0) continue;
                TextOut(hdc, gRain[i].x, gRain[i].y, words[i], lstrlen(words[i]));
            }
            EndPaint(hWnd, &ps);
            return 0;
        case WM_DESTROY:
            KillTimer(hWnd, 1);
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hWnd, iMessage, wParam, lParam);
    }

创建窗口时,我想立即生成定时器事件,ID 1。 所以我像这样使用了SendMessage函数

SendMessage(hWnd, WM_TIMER, 1, (LPARAM)&timerproc);

但它不起作用。

仅当计时器向所属线程的消息队列发出信号以生成一个消息时,该回调才会被计时器调用。WM_TIMER消息,然后由(Peek|Get)Message()并传递给DispatchMessage()通过线程的消息循环。这是DispatchMessage()如果已分配,则调用计时器回调,否则它会传递WM_TIMER向窗口的 WndProc 发送消息:

If the lpmsg参数指向一个WM_TIMER消息和lParam的参数WM_TIMER消息不是NULLlParam指向一个被调用的函数而不是窗口过程。

Using SendMessage()绕过窗口的消息队列,直接进入窗口的WndProc。这就是为什么您没有看到计时器回调被调用的原因。

所以,至少,你必须使用PostMessage()代替SendMessage()这样你的手册WM_TIMER消息可以通过窗口的消息队列到达DispatchMessage():

PostMessage(hWnd, WM_TIMER, 1, (LPARAM)&timerproc);

否则,你必须打电话DispatchMessage()直接用假的MSG你自己:

MSG msg = {};
msg.hwnd = hWnd;
msg.message = WM_TIMER;
msg.wParam = 1;
msg.lParam = (LPARAM) &timerproc;
msg.time = GetTickCount();
GetCursorPos(&msg.pt);
DispatchMessage(&msg);

然而,这实际上没有必要,因为......

如何在窗口第一次启动时激活timerproc?

回调是一个函数,因此只需直接调用它即可,就像任何其他函数一样:

//SendMessage(hWnd, WM_TIMER, 1, (LPARAM)&MakeRain);
MakeRain(hWnd, WM_TIMER, 1, GetTickCount());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 sendmessage 发送 win32 中具有计时器过程的 wm_timer 的相关文章

  • 如何删除Windows 10版本1809剪贴板历史记录?

    如果我启用剪贴板历史记录 https www windowscentral com how use new clipboard windows 10 october 2018 update在 Windows 10 版本 1809 上 它将开
  • 从会话 0(服务)启动提升的用户进程[重复]

    这个问题在这里已经有答案了 大家早 这个问题似乎已被问过几次 但我找不到它是否真的可能 我已发布于here http social msdn microsoft com Forums windowsdesktop en US 80e4e75
  • 如何从 Angular 计时器获取当前时间

    我正在测试角度计时器 http siddii github io angular timer 并且发现自己想知道如何在控制器中获取当前时间 以便将其用于我可能有的任何目的 例如 我想当达到特定的分钟数时 将计时器的字体颜色设置为红色 但我完
  • 在 Windows Vista 和 Windows 7 上使用 HEAP_NO_SERIALIZE 的堆内存函数速度减慢约 100 倍的原因

    我正在尝试追踪 Windows Vista 和 Windows 7 中堆内存功能的巨大减慢 我没有在任何服务器版本上进行测试 这种情况在 Windows XP 上根本不会发生 只会在 Microsoft 较新的操作系统上发生 我最初在 Wi
  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 向窗口句柄发送消息

    我尝试使用 sendmessage 将消息从我的 C 应用程序传递到 C 我的c 代码是这样的 int tmain int argc TCHAR argv COPYDATASTRUCT cpd cpd dwData 0 LPCWSTR st
  • 如何从更高级别启动用户级别的 Exe

    我希望一个进程始终在用户级别运行 当它由以管理员级别运行的安装程序 自定义 而不是 msi 启动时 或者当用户登录时 环顾四周 我不确定这是否可能 最简单的方法是有 2 个进程 一种是普通用户 它启动提升 管理进程 然后管理进程可以使用 I
  • C# 的 user32 和内核方法列表 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个很好的清单来说明我们可以从中进口什么user32 dll and kernel dll并在 C 中使用 我是 Windows A
  • .net 应用程序中的内存泄漏

    我正在 VB net 2005 中开发一个桌面应用程序 该应用程序包含一个间隔为 1 分钟的计时器 每次计时器计时 就会执行一组函数 大部分与数据库相关 最初 应用程序运行良好 在进程 任务管理器 中 每次调用计时器时 CPU 使用率都会达
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您
  • 如何使用 WinAPI 读取 MessageBox 文本

    如何读取标准Win消息框 Info 的消息 Using SendMessage this HandleControl WM GETTEXT builder Capacity builder 我只能读取消息框的标题或按钮的文本 但不能读取消息
  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • 如何在超时后关闭上下文菜单?

    我需要有一个上下文菜单 当前使用 TrackPopupMenu 创建 在一段时间不活动后自动关闭 我正在尝试搜索 但只找到相反的结果 如何activate超时后的弹出窗口 或针对特定应用程序的专门内容 我发现的唯一接近的事情是枚举桌面的子级
  • 原子 x86 指令与 MS 的 InterlockedCompareExchange 文档的对齐要求?

    微软提供了InterlockedCompareExchange http msdn microsoft com en us library ms683560 28VS 85 29 aspx用于执行原子比较和交换操作的函数 还有一个 Inte
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 如何在单击按钮时清除反应挂钩中的间隔

    我正在用反应钩子构建一个简单的计时器 我有两个按钮启动和重置 当我单击开始按钮时 handleStart 函数工作正常 计时器启动 但我不知道如何在单击重置按钮时重置计时器 这是我的代码 const App gt const timer s
  • 确定矩形在窗口内是否可见

    我想确定窗口内的矩形是否完全可见 我找到了 RectVisible 但该函数确定矩形的任何部分是否可见 我想知道整个矩形是否可见 有没有这方面的功能 首先通过使用将系统剪切区域 窗口的可见区域 变成一个区域GetRandomRgn http
  • 发送和接收 Windows 消息

    Windows 消息似乎是通知 Windows 操作系统上的应用程序的好方法 它实际上运作良好 但我想到了几个问题 How to指定结构化数据lparamSendMessage 例程 就像许多消息代码一样 我的意思是 参数当然是一个指针 但
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition

随机推荐

  • r 中字符变量名称的循环

    我有一个变量列表 例如 a1 a2 a3 然后我想对这些变量进行循环 例如赋值 我尝试了粘贴 它只给出了像 a1 这样的字符 这不是我真正想要的 谁能提供解决方案吗 我们可以用mget获取 a 中的值list lst lt mget pas
  • 将 csv 转换为 JSON 树结构?

    我读了这些问题 csv数据到d3中的嵌套json树 https stackoverflow com questions 19043561 csv data to nested json tree in d3 在python中从csv列表创建
  • 使用 @DefaultProperty 时“元素未定义默认属性”

    我正在尝试创建一个自定义 JavaFX 元素以在 FXML 中使用 但是当FXMLLoader尝试解析它 它抛出一个异常 指出 javafx fxml LoadException 元素未定义默认属性 然而 经过一些研究后 我相信我正确地定义
  • SQLite动态查询

    我有一个 SQLite 数据库 我想做的是用户选择一个过滤器 例如 我有一个书籍数据库 用户只想查看 阿加莎克里斯蒂的书籍 中的数据 因此 我制作了一个带有选择选项的微调器 然后有意将所选字段传递给执行查询选择的另一个活动 我的问题是 如何
  • 将内联 SQL 转换为存储过程

    我正在开发现有的 ASP NET 应用程序 当前的应用程序使用了大量的内联查询 现在他们只想将所有查询重写为存储过程 我的问题是 这些查询非常 动态 并且查询是根据不同的条件连接起来的if else条件 例如 string query Se
  • 为什么 RestTemplate 会消耗过多的内存?

    Question 为什么 Spring 的 RestTemplate 使用过多的堆 特别是G1 Old Generation 发送文件时 Context 我们观察到休息模板 https docs spring io spring frame
  • LINQ 中的条件Where 子句

    假设我在网格中显示数据 并且有许多文本框用于过滤数据 员工 ID 的文本框 如果员工 ID 文本框为空 则不会添加 where 子句 但如果不为空 则将添加 where 子句 如果工资文本框有值或员工姓名文本框有值 我们可以以同样的方式过滤
  • 经典蓝牙 (2.1) 设备可实现的最小数据包延迟是多少?

    我正在使用 RN42 http www microchip com wwwproducts en RN42 http www microchip com wwwproducts en RN42 蓝牙模块以 115200 波特率 UART S
  • gem install Rails 构建错误无法构建 gem 本机扩展

    我的主要目标是让Redmine 与WAMPServer 一起工作 我按照以下步骤操作 如何与 WampServer 一起安装 Ruby on Rails https stackoverflow com questions 2025449 h
  • 在 TypeScript 中导入 JSON 文件

    我有一个JSON文件如下所示 primaryBright 2DC6FB primaryMain 05B4F0 primaryDarker 04A1D7 primaryDarkest 048FBE secondaryBright 4CD2C0
  • jQuery、Chrome 和“selected”属性异常

    我在 Chrome 中遇到了一个问题 但我无法判断这是 Chrome 的错误 jQuery 的错误还是我的代码中的错误 我搜索了 Chromium 的未解决问题 但找不到任何内容 jQuery 也是如此 我在这里创建了一个 JSFiddle
  • 在 Node.js 中,给定一个 URL,如何检查它是否是 jpg/png/gif?

    我目前的方法是这样的 var request require request var mime require mime var fs require fs var uri http www sweetslyrics com images
  • 为什么 CodeIgniter 中的分页链接对我不起作用?

    我正在尝试对我的产品使用 codeigniter 分页 因此有多个产品页面 但它不适合我 我不知道为什么 这是我的控制器中的分页功能 code om in allecadeaus te bepalen hoeveel producten e
  • 如果必要的单元测试失败,我可以使单元测试不确定吗?

    考虑对字典对象进行单元测试 您可能编写的第一个单元测试只是将项目添加到字典并检查异常 下一个测试可能类似于测试计数是否准确 或者字典是否返回正确的键或值列表 然而 后面的每种情况都要求字典首先能够可靠地添加项目 如果添加项目的测试失败 我们
  • 贝宝和PHP?

    我有两种方法可以从用户处检查 1 if user input Amount field lt 5 user credit do update database the remain amount in my database table 2
  • 急切地评估 Prolog 中的所有谓词调用

    正在阅读有关元谓词的 SWI Prolog 文档 http www swi prolog org pldoc man section metapred 我最初假设call f 相当于f where f是一些谓词 但我观察到 在某些情况下 两
  • 是否可以用 Java 构建这样的自定义 GUI?

    我在 Photoshop 中制作了这个 我计划将其用于我的文件共享应用程序 我想知道是否可以为我的应用程序创建具有这种外观和感觉的 GUI 如果我无法仅使用 eclipse 或 NetBeans 来构建它 还有其他工具可以帮助我吗 哦 亲爱
  • 我何时以及为什么需要supportedRuntime元素和sku属性?

    在 Visual Studio 中创建的大多数 如果不是全部 C 以及 F 和 VB 库和可执行项目中 都会自动添加app config指定运行时版本和目标框架名称 TFM 的文件
  • Laravel 4.1:雄辩的偏移和限制

    如何限制 Eloquent 返回的数据 我尝试过这个 data Product all gt take 4 gt skip 3 它返回错误消息 Call to undefined method Illuminate Database Elo
  • 如何使用 sendmessage 发送 win32 中具有计时器过程的 wm_timer

    我有一个计时器 ID 1 它有一个timerproc作为回调函数 我正在 timeproc 中制作其他计时器 ID 2 3 它们使用WM TIMER事件 而不是另一个计时器进程 创建窗口时 我想立即生成定时器事件 ID 1 所以我像这样使用