精华内容
下载资源
问答
  • windows定时器
    2018-10-31 22:27:16

    简单的

    #include <stdio.h>
    #include <windows.h>
    #include <conio.h>
    
    void CALLBACK TimerOutProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime)
    {
    	printf("定时器\n");
    }
    int main()
    {	
    	MSG msg;
    	
    	PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); 
    
    	SetTimer(NULL,2,1000,(TIMERPROC)TimerOutProc);
    
    	while(GetMessage(&msg, NULL, 0, 0) )
    	{
    		if(msg.message == WM_TIMER)
    		{
    			TranslateMessage(&msg);    // 翻译消息
    			DispatchMessage(&msg);     // 分发消息
    		}
    	}
    
    	return 0;
    }
    

    完美的

    #include <stdio.h>
    #include <windows.h>
    #include <conio.h>
    
    UINT cnt = 0;
    
    // 定时器回调函数
    void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime);
    // 线程回调函数
    DWORD CALLBACK ThreadProc(PVOID pvoid);  
    
    // 主函数
    int main()
    {
    	DWORD dwThreadId;
    	// 创建线程
    	HANDLE hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, &dwThreadId); 
    	printf("hello, thread start!\n");
    	getchar();       // 得到键盘输入后再退出
    	return 0;
    }    
    
    void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime)
    {
    	cnt ++;
    	printf("thread count = %d\n", cnt);
    }
    
    DWORD CALLBACK ThreadProc(PVOID pvoid)
    {
    	MSG msg;
    	PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); 
    	SetTimer(NULL, 10, 1000, TimeProc);
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		if(msg.message == WM_TIMER)
    		{
    			TranslateMessage(&msg);    // 翻译消息
    			DispatchMessage(&msg);     // 分发消息
    		}
    	}
    	KillTimer(NULL, 10);
    	return 0;
    }
    
    
    更多相关内容
  • windows定时器

    千次阅读 2019-12-24 22:28:30
    Microsoft Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。您的程序将时间间隔告诉Windows,例如「每10秒钟通知我一声」,然后Windows给您的程序发送周期性发生的WM_...

    Microsoft Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。您的程序将时间间隔告诉Windows,例如「每10秒钟通知我一声」,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。

    初看之下,Windows定时器似乎不如键盘和鼠标设备重要,而且对许多应用程序来说确实如此。但是,定时器比您可能认为的要重要得多,它不只用于计时程序,比如出现在工具列中的Windows时钟和这一章中的两个时钟程序。下面是Windows定时器的其它应用,有些可能并不那么明显:

    • 多任务虽然Windows 98是一个优先权式的多任务环境,但有时候如果程序尽快将控制传回给Windows效率会更高。如果一个程序必须进行大量的处理,那么它可以将作业分成小块,每接收到一个WM_TIMER消息处理一块(我将在第二十章中对此做更多的讨论)。
       
    • 维护更新过的状态报告程序可以利用定时器来显示持续变化信息的「实时」更新,比如关于系统资源的变化或某个任务的进展情况。
       
    • 实作「自动储存」功能定时器提示Windows程序在指定的时间过去后把使用者的工作储存到磁盘上。
       
    • 终止程序展示版本的执行一些程序的展示版本被设计成在其开始后,多长时间结束,比如说,30分钟。如果时间已到,那么定时器就会通知应用程序。
       
    • 步进移动游戏中的图形对象或计算机辅助教学程序中的连续显示,需要按指定的速率来处理。利用定时器可以消除由于微处理器速度不同而造成的不一致。
       
    • 多媒体播放CD声音、声音或音乐的程序通常在背景播放声音数据。一个程序可以使用定时器来周期性地检查已播放了多少声音数据,并据此协调屏幕上的视觉信息。

    定时器入门

    您可以通过呼叫SetTimer函数为您的Windows程序分配一个定时器。SetTimer有一个时间间隔范围为1毫秒到4,294,967,295毫秒(将近50天)的整数型态参数,这个值指示Windows每隔多久时间给您的程序发送WM_TIMER消息。例如,如果间隔为1000毫秒,那么Windows将每秒给程序发送一个WM_TIMER消息。

    当您的程序用完定时器时,它呼叫KillTimer函数来停止定时器消息。在处理WM_TIMER消息时,您可以通过呼叫KillTimer函数来编写一个「限用一次」的定时器。KillTimer呼叫清除消息队列中尚未被处理的WM_TIMER消息,从而使程序在呼叫KillTimer之后就不会再接收到WM_TIMER消息。

    Windows本身处理硬件中断,这样应用程序就不必进行处理。对于目前拥有定时器的每个程序,Windows储存一个每次硬件timer tick减少的计数。当这个计数减到0时,Windows在应用程序消息队列中放置一个WM_TIMER消息,并将计数重置为其最初值。

    因为Windows应用程序从正常的消息队列中取得WM_TIMER消息,所以您的程序在进行其它处理时不必担心WM_TIMER消息会意外中断了程序。在这方面,定时器类似于键盘和鼠标。驱动程序处理异步硬件中断事件,Windows把这些事件翻译为规律、结构化和顺序化的消息。

    在Microsoft Windows NT中,定时器的分辨率为10毫秒。

    定时器消息不是异步的

    因为定时器使用硬件定时器中断,程序写作者有时会误解,认为他们的程序会异步地被中断来处理WM_TIMER消息。

    然而,WM_TIMER消息并不是异步的。WM_TIMER消息放在正常的消息队列之中,和其它消息排列在一起,因此,如果在SetTimer呼叫中指定间隔为1000毫秒,那么不能保证程序每1000毫秒或者989毫秒就会收到一个WM_TIMER消息。如果其它程序的执行事件超过一秒,在此期间内,您的程序将收不到任何WM_TIMER消息。事实上,Windows对WM_TIMER消息的处理非常类似于对WM_PAINT消息的处理,这两个消息都是低优先级的,程序只有在消息队列中没有其它消息时才接收它们。

    WM_TIMER还在另一方面和WM_PAINT相似:Windows不能持续向消息队列中放入多个WM_TIMER消息,而是将多余的WM_TIMER消息组合成一个消息。因此,应用程序不会一次收到多个这样的消息,尽管可能在短时间内得到两个WM_TIMER消息。应用程序不能确定这种处理方式所导致的WM_TIMER消息「遗漏」的数目。

    定时器的使用:三种方法

    如果您需要在整个程序执行期间都使用定时器,那么您将得从WinMain函数中或者在处理WM_CREATE消息时呼叫SetTimer,并在退出WinMain或响应WM_DESTROY消息时呼叫KillTimer。根据呼叫SetTimer时使用的参数,可以下列三种方法之一使用定时器。

    方法一

    这是最方便的一种方法,它让Windows把WM_TIMER消息发送到应用程序的正常窗口消息处理程序中,SetTimer呼叫如下所示:

    SetTimer (hwnd, 1, uiMsecInterval, NULL) ;      

    第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口句柄。第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。

    您可以通过呼叫

    KillTimer (hwnd, 1) ;    

    在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。

    当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器ID。wParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID:

    #define TIMER_SEC 1      
    #define TIMER_MIN 2       

    然后您可以使用两个SetTimer呼叫来设定两个定时器:

    SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;      
    SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;
    

    方法二

    设定定时器的第一种方法是把WM_TIMER消息发送到通常的窗口消息处理程序,而第二种方法是让Windows直接将定时器消息发送给您程序的另一个函数。

    接收这些定时器消息的函数被称为「callback」函数,这是一个在程序之中但是由Windows呼叫的函数。告诉Windows此函数的地址,然后Windows呼叫此函数。这看起来也很熟悉,因为程序的窗口消息处理程序实际上也是一种callback函数。当注册窗口类别时,要将函数的地址告诉Windows,当发送消息给程序时,Windows会呼叫此函数。

    SetTimer并非是唯一使用callback函数的Windows函数。CreateDialog和DialogBox函数,使用callback函数处理对话框中的消息;有几个Windows函数(EnumChildWindow、EnumFonts、EnumObjects、EnumProps和EnumWindow)把列举信息传递给callback函数;还有几个不那么常用的函数(GrayString、LineDDA和SetWindowHookEx)也要求callback函数。

    像窗口消息处理程序一样,callback函数也必须定义为CALLBACK,因为它是由Windows从程序的程序代码段呼叫的。callback函数的参数和callback函数的传回值取决于callback函数的目的。跟定时器有关的callback函数中,输入参数与窗口消息处理程序的输入参数一样。定时器callback函数不向Windows传回值。

    TimerProc的参数hwnd是在呼叫SetTimer时指定的窗口句柄。Windows只把WM_TIMER消息送给TimerProc,因此消息参数总是等于WM_TIMER。iTimerID值是定时器ID,dwTimer值是与从GetTickCount函数的传回值相容的值。这是自Windows启动后所经过的毫秒数。

    使用callback函数处理WM_TIMER消息时,SetTimer的第四个参数由callback函数的地址取代,如下所示:

    SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
    

    方法三

    设定定时器的第三种方法类似于第二种方法,只是传递给SetTimer的hwnd参数被设定为NULL,并且第二个参数(通常为定时器ID)被忽略了,最后,此函数传回定时器ID:

    iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;   

    如果没有可用的定时器,那么从SetTimer传回的iTimerID值将为NULL。

    KillTimer的第一个参数(通常是窗口句柄)也必须为NULL,定时器ID必须是SetTimer的传回值:

    KillTimer (NULL, iTimerID) ;     

    传递给TimerProc定时器函数的hwnd参数也必须是NULL。这种设定定时器的方法很少被使用。如果程序在不同时刻有一系列的SetTimer呼叫,而又不希望追踪已经用过了那些定时器ID,那么使用此方法是很方便的。

    获取时间:

    SYSTEMTIME主要用于GetLocalTime和GetSystemTime函数。GetSystemTime函数传回目前的世界时间(Coordinated Universal Time,UTC),大概与英国格林威治时间相同。GetLocalTime函数传回当地时间,依据计算机所在的时区。这些值的精确度完全决定于使用者所调整的时间精确度以及是否指定了正确的时区。可以双击工作列的时间显示来检查计算机上的时区设定。

    typedef struct _SYSTEMTIME     
    {
        WORD   wYear ;
        WORD   wMonth ;
        WORD   wDayOfWeek ;
        WORD   wDay ;
        WORD   wHour ;
        WORD   wMinute ;   
        WORD   wSecond ; 
        WORD   wMilliseconds ;      
    }SYSTEMTIME, * PSYSTEMTIME ;
    

     

    展开全文
  • windows定时器示例代码

    2016-01-25 16:30:00
    Windows定时器使用方法的vs2010示例代码工程:http://blog.csdn.net/a_flying_bird/article/details/50581228
  • C++ 定时器 windows平台

    2021-01-06 21:38:40
    仅在windows10平台下,vs2019编译器上,使用ISO C++14 标准编译通过,目前没有跨平台。 因为代码较少,没有生成库。直接拷贝除Main.cpp之外的.cpp和.h文件到自己的项目中使用。 Main.cpp文件中举例了使用方法。 每一...
  • Windows定时器-12.08.11

    2016-06-14 21:14:49
    Windows定时器
  • Windows定时器

    2016-12-12 11:07:49
    定时器 1 1.1 创建定时器 1 1.2 销毁定时器 1 1.3 定时器的运作 1 1.3.1 产生WM_TIMER消息 1 1.3.2 分发WM_TIMER消息 2 1.4 WM_TIMER 消息的重入 3  第1章 定时器 1.1

     

    1 定时器    1

    1.1 创建定时器    1

    1.2 销毁定时器    1

    1.3 定时器的运作    1

    1.3.1 产生WM_TIMER消息    1

    1.3.2 分发WM_TIMER消息    2

    1.4 WM_TIMER 消息的重入    3

     

     

    1 定时器

    1.1 创建定时器

    请使用API函数 SetTimer 来创建定时器,其原型如下:

    UINT SetTimer(HWND hWnd,UINT nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc);

    有这么两种用法

    1SetTimer(hWnd,nID,uElapse,NULL);定时给窗口 hWnd 寄送(PostMessage) WM_TIMER 消息;

    2SetTimer(hWnd,nID,uElapse,TimerProc); 不论 hWnd 是否为 NULL,定时调用 TimerProc 函数。

    1.2 销毁定时器

    销毁定时器请使用KillTimer函数,其原型如下:

    BOOL KillTimer(HWND hWnd,UINT uIDEvent);

    1个参数应与SetTimer的第1个参数保持一致;

    2个参数:如果SetTimer的第1个参数是一个有效的窗口句柄,则此参数应与SetTimer的第2个参数保持一致。否则此参数应为SetTimer的返回值。

    1.3 定时器的运作

    不论 SetTimer(hWnd,nID,uElapse,NULL) 还是 SetTimer(NULL,nID,uElapse,TimerProc),其实质都是处理WM_TIMER消息。

    1.3.1 产生WM_TIMER消息

    WM_TIMER消息并不是 Windows 系统定时、自动增加到消息队列的,而是调用GetMessagePeekMessage的时候,才会产生WM_TIMER消息。请参考如下代码:

    void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)

    {

    }

     

    UINT TestTimer()

    {

    MSG msg;

    UINT nTimer = SetTimer(NULL,100,1000,TimerProc);

     

    Sleep(3050);

    TRACE(_T("Tick=%d\n"),GetTickCount());

    PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);

    Sleep(1050);

    TRACE(_T("Tick=%d\n"),GetTickCount());

    PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);

     

    while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))

    {

    if(msg.message == WM_TIMER)

    {

    TRACE(_T("Timer=%d\n"),msg.time);

    }

    }

    KillTimer(NULL,nTimer);

    return 0;

    }

    Windows XP下,运行结果为:

    Tick=7356593

    Tick=7357656

    Timer=7356593

    Timer=7357656

    虽然两次Sleep的时间合计有4秒多,但消息队列中WM_TIMER的个数并不是4个而是2个。而且这两个WM_TIMER的时刻与两次GetTickCount的时刻完全相等。合理的解释是:在调用PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);时,WM_TIMER消息才被创建并增加到消息队列。如果调用GetMessagePeekMessage(&msg,NULL,0,0,PM_REMOVE);则创建的WM_TIMER消息不会被增加到消息队列。

    1.3.2 分发WM_TIMER消息

    通过GetMessagePeekMessage获得消息之后,一般会调用TranslateMessageDispatchMessage 进行消息处理。

    TranslateMessage WM_TIMER 消息不做任何处理。

    DispatchMessage(&msg) 负责分发 WM_TIMER 消息,其处理逻辑如下:

    if(msg.lParam)

    {//如果SetTimer的第4个参数不为NULL,则调用这个回调函数

    TIMERPROC pfn = (TIMERPROC)msg.lParam;

    pfn(msg.hwnd,WM_TIMER,msg.wParam,msg.time);

    }

    else

    {//交给窗口过程去处理

    WNDPROC pfn = (WNDPROC)GetWindowLong(msg.hwnd,GWL_WNDPROC);

    CallWindowProc(pfn,msg.hwnd,WM_TIMER,msg.wParam,msg.lParam);

    }

    也就是说:如果SetTimer的第4个参数不为 NULL,则第1个参数所指定的 hwnd 将无法接收、处理 WM_TIMER 消息。

    1.4 WM_TIMER 消息的重入

    所谓重入就是当前的消息还没有处理完毕就进入下一个消息的处理。因为WM_TIMER消息是入队消息,所以一般情况下,对WM_TIMER的处理是不会重入的。但也有特殊情况,请参考如下代码:

    //定义定时器处理函数

    void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)

    {

    TRACE(_T("进入 OnTimer=%lu\n"),dwTime);

    Sleep(3500);

    MSG msg;

    while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))

    {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

    }

    Sleep(1000);

    TRACE(_T("离开 OnTimer=%lu\n"),dwTime);

    }

    //设置定时器

    SetTimer(100,1000,TimerProc);

    本来TimerProc一秒被调用一次,现在情况发生了变化:在TimerProc内部,Sleep(3500)后再调用PeekMessage会立即产生WM_TIMER消息。DispatchMessage会再次调用TimerProc函数处理这个消息。结果就是TimerProc函数无限制的递归调用自己,永远不会返回,最终会因为栈空间溢出而导致程序异常退出。

    为了防止TimerProc函数的重入并可能引起的程序崩溃,就需要阻止重入TimerProc函数。可行的方法之一如下:

    void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)

    {

    static bool bWorking = false; //是否正在处理 WM_TIMER 消息

    if(bWorking)

    {//如果正在处理 WM_TIMER 消息则返回,这样就防止了重入

    return;

    }

    bWorking = true;        //标记正在处理 WM_TIMER 消息

    ... ... ...            //处理 WM_TIMER 消息

    bWorking = false;        //标记 WM_TIMER 消息已经处理完毕

    }

     

    展开全文
  • Windows定时器线程实现

    2011-11-14 15:42:33
    该程序本来是在WinCE驱动中使用的,但只使用线程和事件机制,所以在CE应用软件或其他平台Windows应用层使用
  • [C/C++]windows定时器

    千次阅读 2018-07-13 14:40:38
    #include &amp;lt;...windows.h&amp;gt; VOID CALLBACK VirtualIDCallback(PVOID lpParameter, BOOLEAN TimeOrWaitFired); int main() { HANDLE handle = NULL; HANDLE hTimer = NUL...
    #include <stdio.h>
    #include <windows.h>
    
    VOID CALLBACK VirtualIDCallback(PVOID lpParameter, BOOLEAN TimeOrWaitFired);
    int main()
    {
            HANDLE handle = NULL;
            HANDLE hTimer = NULL;
            HANDLE hTimerQueue = NULL;
            int arg = 0;
            handle = CreateEvent(NULL, TRUE, FALSE, NULL);
            if (NULL == handle)
            {
                printf("CreateEvent失败\n");
                return 1;
            }
            hTimerQueue = CreateTimerQueue();
            if (NULL == hTimerQueue)
            {
                printf("CreateTimeQueue失败\n");
                return 1;
            }
            if (!CreateTimerQueueTimer(&hTimer, hTimerQueue, WAITORTIMERCALLBACK(VirtualIDCallback), &arg, 5000, 10000, NULL))
            {
                printf("CreateTimeQueueTimer失败\n");
                return 1;
            }
            if (WaitForSingleObject(handle, INFINITE) != WAIT_OBJECT_0)
            {
                printf("WaitForSingObject失败\n");
                return 1;
            }
            CloseHandle(handle);
            if (hTimer)
            {
                if (!DeleteTimerQueueTimer(hTimerQueue, hTimer, INVALID_HANDLE_VALUE))
                {
                    Sleep(1000);
                    if (!DeleteTimerQueueTimer(hTimerQueue, hTimer, INVALID_HANDLE_VALUE))
                        return 0;
                }
            }
            return 0;
    }
    
    VOID CALLBACK VirtualIDCallback(PVOID lpParameter, BOOLEAN TimeOrWaitFired)
    {
        // 定时器逻辑代码
    }
    展开全文
  • windows自带的定时器精度一般在10ms量级,精确度不足,在部分需要高...关键的是,该定时器通过类封装后,使用方法与windows定时器类似。 本代码是原代码,属原创代码,是按照现实需求而开发的,具有很高的实用价值。
  • windows系统中添加定时计划任务的.net组件,以方便编程。
  • Windows定时器资源文件

    2013-02-27 20:29:50
    Windows定时器的资源文件,需要配合响应代码使用,代码参见博主文章!
  • Windows高精度定时器(VC++实现)

    热门讨论 2014-01-11 17:24:03
    Windows平台高精度定时器封装类,最高精度可达1ms。
  • 【整理】Windows 定时器 与自定消息

    千次阅读 2017-01-07 11:49:34
    windows的 还是要多深入了解windows系统底层。很简单,其实就是定时器清空内存,开线程。线程发消息写内存。Created with Raphaël 2.1.0定时器定时器线程线程清空 开启线程写入内存完毕开启(第一次用这个画图,...
  • Windows定时器使用方法

    千次阅读 2016-01-25 16:28:24
    范围本文只讨论MFC环境下使用定时器的例子,用纯Win32 SDK是类似的。
  • Windows内核定时器总结

    2020-11-18 07:39:29
    总结了两种内核态的定时器,IO定时器和DPC定时器。其显著特点是IO定时器精度至少为1秒而DPC定时器可以精确到100ns级别。 DPC定时器使用步骤: KeInitializeTimer初始化定时器 KeInitializeDpc(和1的步骤顺序无所谓...
  • #pragma once #ifdef _WINDOWS #include <Windows.h> #else //请添加相应系统版本实现 #endif namespace gdc ... typedef void(*TimerCallback)(void ... * @brief 定时器类 */ class GDCTimer { public: GD.
  • windows下c定时器使用

    2021-04-28 00:12:23
    windows下c定时器使用需求解决参考 需求 由于程序使用阻塞方式计时,导致程序效率过低,使用定时器来进行计时,保证程序效率 解决 https://docs.microsoft.com/en-us/previous-versions//ms713423(v=vs.85)?...
  • 定时器在VC中的使用频繁,以下讨论定义器的使用方法。定时器的原型是:WINUSERAPI UINT WINAPI SetTimer ( HWND hWnd , UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);hWnd 是欲设置定时器的窗体句柄。定时...
  • windows定时器解析

    2008-12-19 19:35:09
    windows定时器解析.................................................................了解下windows定时器。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • ##创建测试类新建Java工程创建测试类如下代码:(创建文件验证定时器是否执行)package makeFile;import java.io.File;import java.io.IOException;public class MakeFlie {public static void main(String[] args) {/...
  • 因为GetMessage不会时时刻刻检测定时器的消息,所以,只有等到GetMessage空闲的时候,才会检测。
  • windows 定时器PHP 访问接口

    千次阅读 2017-09-25 14:15:17
    先找到Windows的任务计划   接下来创建定时任务 创建定时任务的项目 设置触发器的时间 设置计划任务启动的时间和次数 之后点下一步就好了,完成之后点击运行可以测试定时任务是否...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,707
精华内容 17,882
关键字:

windows定时器

友情链接: CLOSID (2).rar