C++中消息机制阻塞实验

2023-05-16

VC6标准WIN32程序,Windows消息处理机制:

1.在注册窗口类时,指定了消息处理函数WndProc()。

2.WinMain()里有消息循环:

    while (GetMessage(&msg, NULL, 0, 0))

    {

       if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

       {

           TranslateMessage(&msg);

           DispatchMessage(&msg);

       }

    }

3.在WndProc()里,对各个消息进行处理!!

  • 消息队列是线程所有,并非窗口所有和进程所有。
  • 一个线程的所有窗口,比如父窗口(主窗口)、对话框、消息框等都是使用这个线程的同一个消息队列!!!!
  • 窗口有消息循环。窗口里的控件应该就没有消息循环了吧。

试验:

一、MFC中,用TIMER,发现,在TIMER响应函数中,用MessageBox(),则会不断地出现MessageBox。

而且当前响应函数会停止在MessageBox上,直到MessageBox返回才继续执行后面的语句!

用SendMessage或PostMessage来试消息响应,也是一样:响应函数中有MessageBox(),则会出现多个MessageBox。

说明MessageBox阻塞了函数,却没有阻塞消息分发。

二、VC建WIN32程序(标准HELLO WORLD),试验发现,如果WndProc()里有MessageBox,当前的WndProc()会暂时停止在MessageBox,直到MessageBox返回才继续执行后面的语句!!

如果MessageBox出现,这时一个WM_PAINT出现了,则会执行一个新的WndProc()。即WndProc()并行出现了!!线程只有一个,但WndProc()可以出现多个!

用ABOUT对话框代替MessageBox,情况也是一样!ABOUT对话框出现时,父窗口(即主程序)点不出来,但父窗口WM_PAINT能正常运行!!!

即像别的文章说的,对话框和消息框会有自己的消息循环,但线程是同一个线程,所以线程的所有消息会被分发处理。

三、再试下面程序,

void CUnicodewcharDlg::OnButton4()

{

    SendMessage(UM_SOCK);      // UM_SOCK为自定义消息,已经和OnRecv相关联

}

BOOL running=FALSE;

void CUnicodewcharDlg::OnRecv()

{

    if (running==TRUE) {::MessageBox(NULL,"ERROR","",MB_OK); return;}

    running=TRUE;

    ::MessageBox(NULL,"OK","",MB_OK);

::MessageBox(NULL,"返回","",MB_OK);

    running=FALSE;

}

发现,按OnButton4后,先出现一个"OK"消息框,再点OnButton4,就出现"ERROR"消息框。

如果"OK"消息框关闭了,则不会出现"返回"消息框,再点OnButton4,仍是出现"ERROR"消息框!!!!!!!

一定要"ERROR"消息框和"OK"消息框都关闭了,才会出现"返回"消息框,再点OnButton4,才会出现"OK"消息框!!

说明是:

父窗消息循环,调用消息响应函数生成了第一个消息框,同时父窗调用的消息响应函数阻塞,父窗消息循环阻塞;第一个消息框开始接手负责消息循环(是自己有消息循环还是把父窗的消息循环重入了继续使用?)。

第一个消息框消息循环,调用消息响应函数生成了第二个消息框,同时第一个消息框调用的消息响应函数阻塞,第一个消息框消息循环阻塞;第二个消息框开始接手负责消息循环(是自己有消息循环还是把父窗的消息循环重入了继续使用?)。

第二个消息框消息循环。。。

即:父窗阻塞->第一个消息框阻塞->第二个消息框

如果第一个消息框关闭,但第二个消息框未关闭,则第一个消息框调用的消息响应函数仍在阻塞中,故父窗调用的消息响应函数也在阻塞中,所以继续运行不下去,而第二个消息框仍在进行消息循环。只有第二个消息框关闭了,第一个消息框调用的消息响应函数才会继续运行并返回,然后父窗调用的消息响应函数才会继续运行并返回!!!

第二个消息框消息循环,收到父窗WM_PAINT,调用父窗消息响应函数,WM_PAINT这一部分如果没有阻塞,则消息响应函数可以马上返回。再进行下一个消息处理。所以父窗不会因为没有刷新而失去显示,否则就显示不正常了。

消息响应函数可以同时多次进入,比如父窗调用了阻塞了,第一个消息框又调用了阻塞了,第二个消息框又调用了。。。

三、试验子窗口是自己有消息循环还是把父窗的消息循环重入了继续使用?

用WIN32(标准HELLO WORLD)程序来试:

在WinMain()中:

    while (GetMessage(&msg, NULL, 0, 0))

    {

       if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

       {

           TranslateMessage(&msg);

           if(msg.message ==WM_COMMAND) WinExec("cmd /k echo TranslateMessage()ok",SW_SHOW);      //加上这句

           DispatchMessage(&msg);

           if(msg.message ==WM_COMMAND) WinExec("cmd /k echo DispatchMessage()ok",SW_SHOW);       //加上这句

       }

    }

在WndProc()中:

case IDM_ABOUT:

       //DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);  //这句屏蔽掉

       MessageBox(NULL,"in about","",MB_OK);  //加上这句,这样父窗就可以点出来了

发现,点菜单的ABOUT..., WinExec(显示TranslateMessage()ok)执行,显示出MessageBox;MessageBox关闭后,WinExec(显示DispatchMessage()ok)才会执行。    OK,符合正常的消息处理原则,即DispatchMessage()要等到WndProc()执行完才会返回。

重新开始试:

1. 点菜单的ABOUT..., WinExec(显示TranslateMessage()ok)执行,显示出第一个MessageBox。

2. 再到主窗,点菜单的ABOUT..., 显示出第二个MessageBox,但WinExec(显示TranslateMessage()ok)没有执行!!

3. 关闭第一个MessageBox,WinExec(显示DispatchMessage()ok)仍没有执行。  

4. 最后,关闭第二个MessageBox,DispatchMessage()ok)才执行。

结论:

对话框、消息框等子窗口是用自已默认的消息循环,而不是重入到父窗的消息循环!!

主窗阻塞了,第1个子窗负责消息循环,调用线程的消息响应函数(包括主窗、第1个子窗的消息响应函数);

第1个子窗阻塞了,第2个子窗负责消息循环,调用线程的消息响应函数(包括主窗、第1个子窗、第2个字窗的消息响应函数);。。。

子窗是一级一级阻塞下去的,后一个子窗关闭了,才能使前一个子窗的消息响应函数解除阻塞。

如果处在中间的子窗关闭了,它的消息响应函数仍还在阻塞中!只有它后面的子窗都关闭了,它的消息响应函数才会返回。

所以,如果是基于消息来处理事件,比如,网络SOCKET异步编程,消息处理函数中,有用到消息框MessageBox或对话框,则要小心,以免多个事件消息同时发生。因为消息框出现后,当前消息处理函数阻塞了,但消息循环仍在进行,如果有新的消息事件产生,则会运行新的消息处理函数,则有可能会产生不希望的后果。

四、后来,试验网络SOCKET异步编程,确实,弹出MessageBox后,消息循环仍在继续,如果有收到FD_READ、FD_ACCEPT等,都会执行消息处理函数。

如果消息处理函数中弹出MessageBox,这时下一个消息来了,则会再运行一个新的消息处理函数!而不是阻塞。即消息处理函数同时被多次调用,多个并存!

===================================

下面引用网络的文章:

===================================

如流,新一代智能工作平台

DispatchMessage

2008年10月18日 星期六 14:33

windows消息处理机制是这样的:

首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息 放到一个系统消息队列中去。

而应用程序需要有自己的消息队列,也就是线程消息队列,每一个线程有自己的消息队列,对于多线程的应用程序就有和线程数目相等的线程消息队列。

winsows消息队列把得到的消息发送到线程消息队列,线程消息队列每次取出一条消息发送到指定窗口,不断循环直到程序退出。这个循环就是靠消息环(while(GetMessage()) TranslateMessage();DispatchMessage(); 实现的。

GetMessage()只是从线程消息中取出一条消息,而DispatchMessage 则把取出的消息发送到目的窗口。如果收到WM_CLOSE消息则结束循环,发送postqiutmessage(0),处理WM_DESTROY销毁窗口! 

其实问题的关键在于:DispatchMessage到底干了什么?

如果只是去调用相应的窗口,那自己写个switch不就可以了 ?

DispatchMessage与switch不同之处在于DispatchMessage会 先调用windows,进入管态(大概是range 0),然后再由windows调用 窗口的函数。

为什么这么麻烦?

因为这样windows就可以知道你的程序运行到什么情况了, windows来调用你的窗口,这样你的窗口返回的时候,windows就知道你已经处理过一个消息了,如果没有新的消息进入消息队列,windows就不再会给你的进程分配时间片。

如果是你自己写switch的话,windows就不可能这样灵活的分配时间,资源利用率就会降低。

那么还要消息循环干什么,windows直接把消息发给窗口不就可以了吗?

因为你要在消息循环里把KEY_DOWN和KEY_UP组合成WM_CHAR,还可以直接屏蔽掉许多对你来说无用的消息,加快速度。

GetMessage:      从线程的消息队列取出一个消息 。GetMessage是从系统为每个应用程序自动分配的消息对列的头部得到一个消息。  

TranslateMessage:     将msg结构传给Windows,进行一些转换,比如A键按下,转换成WM_CHAR消息等 。TranslateMessage是对一些键盘事件做预处理。TranslateMessage是翻译需要翻译的消息。  翻译消息不是简单的转换,一个消息被翻译后,可能会产生几个消息。

DispatchMessage():      再将msg结构传给Windows,Windows将该消息发给窗口过程,由窗口过程处理。  DispatchMessage()则会把翻译好的消息发送到系统的消息处理函数中,而这个函数又会把这个消息传递到注册窗体时用户指定的消息处理函数中

前面已经介绍从系统队列里获取一条消息,然后经过快捷键的函数检查,又通过字符消息函数的转换,最后要做的事情就是调用DispatchMessage函数,它的意思就是说要把这条消息发送到窗口里的消息处理函数WindowProc。

===================================

消息的循环过程大致为(关于消息的具体情况不再说明)

 1. 消息循环调用GetMessage()从消息队列中查找消息进行处理,如果消息队列为空,程序将停止执行并等待(程序阻塞)。

 2. 事件发生时导致一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息时返回0;如果返回值为负表明发生了错误。

    3. 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。这一步实际上是可选的,但有些地方需要用到这一步。

    4. 上面的步骤执行完后,将消息传递给DispatchMessage()函数。DispatchMessage()函数将消息分发到消息的目标窗口,并且查找目标窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。

   5. 在窗口过程函数中,检查消息和其他参数,你可以用它来实现你想要的操作。如果不想处理某些特殊的消息,你应该总是调用DefWindowProc()函数,系统将按按默认的方式处理这些消息(通常认为是不做任何操作)。

   6. 一旦一个消息处理完成,窗口过程函数返回,DispatchMessage()函数返回,继续循环处理下一个消息。

================================

DispatchMessage将消息分发到窗口函数中,请问:DispatchMessage是直接返回还是等待WndProc处理完毕再返回?

用::DiapatchMessage派送消息,在窗口处理过程(WinProc,窗口函数)返回之前,他是阻塞的,不会立即返回,也就是消息循环此时不能再从消息队列中读取消息,直到::DispatchMessage返回。如果你在窗口函数中执行一个死循环操作,就算你用   PostQuitMessage函数退出,程序也会down掉。

while(1)

{

        PostQuitMessage(0);   //程序照样down.

}

    所以,当窗口函数处理没有返回的时候,消息循环是不会从消息队列中读取消息的。这也是为什么在模式对话框中要自己用无限循环来继续消息循环,因为这个无限循环阻塞了原来的消息循环,所以,在这个无限循环中要用GetMessage,PeekMessage,DispatchMessage来从消息队列中读取消息并派送消息了。要不然程序就不会响应了,这不是我们所希望的。

模式对话框是卡住了啊,只不过它内部死循环中又有PeekMessage,GetMessage什么的了,所以不会对界面操作产生影响

我记得IsDialogMessage只适用于模式对话框吧,非模式对话框不需要的。

还有,如果是模式对话框,下面的窗口还是可以处理WM_PAINT的,你移动上面的模式对话框,下面的窗口可以自己重画

刚才试了一下,DispatchMessage果然是会卡住等待WndProc返回才返回的。模式对话框的确是有内嵌消息循环的,包括MessagaBox也是一样。

WM_PAINT和WM_TIMER都是优先级不同的,WM_TIMER优先级最低,只有队列里没有其他消息才会执行,WM_PAINT则较高

从窗口创建开始说:

CreateWindowEx,这个会向窗口例程直接投递WM_CREATE,而不进入消息队列。其他消息则是比较正常的经过消息队列,然后通过GetMessage和DispatchMessage取消息和分发到相应例程,直到取到WM_QUITE就结束消息循环。

对于按键和鼠标消息则是先进入系统消息队列,然后系统队列会分发到相应的线程消息队列。

记住,消息队列是线程所有,并非窗口所有和进程所有,当然,系统队列例外。

===================================================================

刚才学了用 c 和 windows API 创建一个简单的windows 窗口程序,步骤如下:

1.设计一个窗口类

2.创建窗口

3.显示窗口

4.定义消息结构体,开始消息循环,如:

   while(GetMessage(&msg,NULL,0,0)){

       略...        

   }

5.编写窗口过程函数,如:

  LRESULT CALLBACK WinSunProc(参数略){

      switch(uMsg)

      {

         case 某一事件;

              执行某函数;

              break;

         case 某一事件;

              执行某函数;

              break;

         default;

               略

         

      }

  }

我的问题是, 当发生了一个消息时, 会执行switch 语句 中的某条case语句, 就是在此时此刻,while语句还在监听消息吗??????    

如何你在窗口函数case不返回的话这个窗口就会没响应的,你可以试试看在一个case里写Sleep(5000)

有些人已经说对了,GetMessage只负责从消息队列里面取出一条消息,TranslateMessage将键盘敲键的消息转换成WM_CHAR消息,DispatchMessage就负责调用你的窗口函数,其实相当于

... DispatchMessage(...)

{

    ....

     WinSunProc(...):  //事实上这里是通过你注册窗口类时候给Windows的函数指针来实现的,但是效果和直接调用一样。

}

现在整个流程就很清楚了,GetMessage -> DispatchMessage -> WinSunProc 然后再返回到主循环进行下一条消息的操作,如果你在WinSunProc里面一直不返回,那么程序是无法处理下条消息的。

处理消息的时候如果又有其他消息过来是没关系的,Windows的GetMessage是从消息“队列”里面去消息的,没来得处理的消息是会排队在消息队列里面的,微软说了Windows的消息队列足够长,一般不会出现消息丢失的情况,具体没说多长,可能根据操作系统版本不同有不同的长度限制。

另外GetMessage还有个特性,如果程序的消息队列是空的,也就是没有消息了,那么GetMessage就不会返回,直到等到下一条消息来再返回,Windows会将处于等待的程序转入Idle模式,所以那个while循环是不会出现CPU100%的占用率的。

如果你希望在程序没有消息的时候在后台做点什么事情,那么就可以利用PeekMessage,典型的MFC就是利用了PeekMessage来运作消息循环的,PeekMessage在队列中有消息的时候则把消息取回,没消息的时候也会立刻返回,这样你就可以在没消息的时候做点别的事情。

MFC的CWinApp类在Run这个函数中包含了消息循环,在没有消息的时候,Run会去调用CWinApp::OnIdle,默认的OnIdle会负责释放不需要再使用的动态连接库文件。

如果Run里面的PeekMessage取到消息,他则调用CWinApp::PumpMessage函数,PumpMessage就负责调用DispatchMessage把消息转交给窗口函数。

windows在处理消息时,会使用一个队列来存放所有消息,即消息队列。在执行case语句时,虽然窗口没有关心消息队列,但是如果此时又来了一个消息,windows会自动将该消息放入队列之中,保证消息不会丢失。当case语句处理完毕,窗口再一次运行到GetMessage时,会查看队列中有没有未处理的消息存在,通过这种方式获取之前发生但还没有处理的消息,因此不会出现对消息视而不见的情况

windows采用消息队列来处理消息,没侦听到一个事件,系统会将此消息加到消息队列,再按顺序或者按权重来处理消息。

       所有创建了窗口的Windows程序,都需要运行一个消息循环 :

       while (GetMessage(&msg, hWnd, 0, 0) > 0)

         {

                  TranslateMessage(&msg);

                  DispatchMessage(&msg);

         }

         这里的hWnd就是创建的窗口句柄,上述循环会不断的把该窗口(hWnd)相关的消息取出来,并分发到消息处理函数当中。

         GetMessage函数不是用来监听的,是用来获取当前线程消息队列当中的消息的,其中的第二个参数如果传递一个窗口句柄,那么就会获取该窗口相关的消息,如果传NULL,那么会将线程消息队列中所有的消息都取出来。如果创建了多个窗口,而只对其中一个窗口句柄调用GetMessage形成消息循环,那么别的窗口都会毫无响应。

         补充说明:消息队列是操作系统为每个需要处理消息的线程创建的,任何线程只要调用过与消息有关的函数(如GetMessage,PeekMessage),操作系统就会为该线程创建消息队列。

GetMessage在消息列队中没有消息时是阻塞的,也就是没有消息的情况下他会通知系统把时间片交给其他进程或线程

====================================

1 :消息处理中第一条消息是不是 WM_CREATE

2:当接收到WM_CREATE消息时,他的附加参数中有没有 窗口的实例句柄 在那个参数中或者 有没有其他办法在消息处理中获得窗口的实例句柄 hInstance

3;如果将WM_CREATE交给系统处理的话。。系统做了什么

重复的说下过程吧,首先是定义一个窗口类,然后注册窗口类,然后依照你前边定义好的窗口类来创建一个窗口。以上就是CreateWindow函数调用结束前所做的事情,然后会调用ShowWindow将这个创建好的窗口显示出来。

接下来遇到消息循环了,程序开始从消息队列中取消息。

首先遇到的消息就是WM_CREATE(正如你所问到的),这条消息是由系统向你的应用程序投递的。然后系统会调用你写的那个“回调函数”,它依照你写的WM_CREATE内容来创建一些控件或子窗体。(注意在这个消息中并不创建主窗口,因为创建主窗口的工作早在ShowWindow前就创建好了) 在创建都完成以后就会把整个窗口的样子绘制出来,然后程序就可以处理别的消息啦。

至于第二个问题,它是得到不应用程序的实例句柄的。它的两个赋加参数中,wParam不会被使用,而lParam则是一个指向 CREATESTRUCT 结构体的指针,用于创建子窗体(控件)的一些必要信息。

你要想得到实例句柄要调用函数,最典型的就是GetWindowLong函数。利用该函数取应用程序实例句柄的调和方式如下:

HINSTANCE hAppInstance = (HINSTACE)GetWindowLong(hwnd,GWL_HINSTANCE);

其参数有两个,第一个参数是主窗口的句柄,第二个参数是一个标记,代表你要取实例句柄,该函数还有别的功能,楼主可以自行查阅MSDN

还有其它的函数可以得到实例句柄,比如GetModuleHandle(NULL)的返回值也是实例句柄。

第三个问题已经在前边讲过了,注意你问的不对,这个消息本来就是由系统处理的,并不是你的程序处理的。

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

C++中消息机制阻塞实验 的相关文章

  • Winform中提提升重绘效率-背景的设置

    backgrounglayout属性设置为none xff0c 否则会影响重绘效率
  • mac adb命令报错“zsh: command not found: adb” 及配置 .zshrc

    mac上配置adb xff0c 出现 zsh command not found adb 这个问题困扰我很久 xff0c 因为一直不怎么使用 xff0c 也就没有解决 xff0c 后期phython配置升级时也是遇到类似升级不成功的问题 x
  • Mysql安装和常用命令及问题汇总

    安装 安装mysql时如果dos提示未识别的命令或启动不了mysqld initialize mysql xff0c 可以直接运行环境变量里添加路径下的mysqld exe xff0c 如果系统缺少dll等情况时会显示提示对话框 xff0c
  • C# winform 禁用最小化和还原按钮(消息循环截获处理)

    项目中遇到一些问题 需要根据权限配置去控制用户对系统平台是否可以最小化和还原窗口大小的操作 并且屏蔽系统的一些快捷键 比如 alt 43 F4 windows键 任务管理器等一些操作 代码如下 禁止窗口最小化和还原 窗口启动之后为最大化 偷
  • c#中将HTML文件转换成PDF文件

    一 Pechkin html gt pdf 1 WinForm中转换为PDF a 在项目添加引用 xff0c 引用 gt 管理NuGet程序包 b 在导出PDF按钮中添加方法 1 SynchronizedPechkin sc 61 new
  • c#中一个进程启动另一个进程并传递参数

    1 开启进程 using System Diagnostics ProcessStartInfo process 61 new ProcessStartInfo process FileName 61 34 要开启的进程路径 34 stri
  • Window捕获消息机制及动态创建button-MFC

    PreTranslateMessage 函数捕获键盘按键消息 01 PreTranslateMessage函数 xff0c 常用于屏蔽MFC对话框中默认的Enter和ESC消息 函数原型 xff1a BOOL PreTranslateMes
  • Window捕获消息机制-C#

    C 捕获鼠标消息 在C 中怎样禁用鼠标按键 xff0c 我们可以通过ImessageFilter接口下的PreFilterMessage方法 Application类的AddMessageFilter方法 xff0c RemoveMessa
  • MFC中动态创建控件及添加消息响应的方法实例

    动态控件是指在需要时由Create 创建的控件 xff0c 这与预先在对话框中放置的控件是不同的 一 创建动态控件 xff1a 为了对照 xff0c 我们先来看一下静态控件的创建 放置静态控件时必须先建立一个容器 xff0c 一般是对话框
  • Windows消息ID号查看

    WM NULL 61 0000 WM CREATE 61 0001 应用程序创建一个窗口 WM DESTROY 61 0002 一个窗口被销毁 WM MOVE 61 0003 移动一个窗口 WM SIZE 61 0005 改变一个窗口的大小
  • MFC和c#中模拟对另一进程的窗口按钮点击

    1 在自动化测试中经常要模拟窗口按钮的点击 参考文章 xff1a http blog csdn net blackboyofsnp article details 3372719 有时我们需要这么做 手动模拟按钮按下的事件 让程序做出与按钮
  • C#中进程间通信方式汇总

    一 进程间通讯的方式 进程间通讯的方式有很多 xff0c 常用的有共享内存 xff08 内存映射文件 共享内存DLL 剪切板等 xff09 命名管道和匿名管道 发送消息等几种方法来直接完成 xff0c 另外还可以通过socket口 配置文件
  • ubuntu shared folder to windows

    一 安装smb 执行命令行 xff1a sudo apt get install samba sudo apt get install smbfs 二 添加准备共享的文件夹 有如下三种配置共享文件夹的方法 xff0c 任选一种方法即可 xf
  • C# 获得窗体句柄并发送消息(利用windows API可在不同进程中获取)

    C 使用Windows API获取窗口句柄控制其他程序窗口 编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能 xff0c 而不需要对方程序为你开放接口 比如 xff0c 操作飞信定时发送短信等 我之前开发过飞信耗子 xff0c 用的是对
  • c#中mysql远程连接方法及实例

    region 远程数据库连接测试 需给远程数据库分配所有权限 cmd命令 xff1a grant all privileges on to 39 root 39 64 39 39 with grant option string connS
  • mysql中数据库覆盖导入的几种方式

    众所周知 xff0c 数据库中INSERT INTO语法是append方式的插入 xff0c 而最近在处理一些客户数据导入场景时 xff0c 经常遇到需要覆盖式导入的情况 xff0c 常见的覆盖式导入主要有下面两种 xff1a 1 部分覆盖
  • mysql并发写入性能分析

    目前 xff0c 在很多OLTP场景中 xff0c MySQL数据库都有着广泛的应用 xff0c 也有很多不同的使用方式 从数据库的业务需求 架构设计 运营维护 再到扩容迁移 xff0c 不同的MySQL架构有不同的特点 xff0c 适应一
  • c#中的DefWndProc是Control类的虚函数

    protected override void DefWndProc ref Message m protected override void DefWndProc ref Message m 是Control的虚函数
  • C#使用Win32API获得窗口和控件的句柄

    整个Windows编程的基础 一个句柄是指使用的一个唯一的整数值 即一个4字节 64位程序中为8字节 长的数值 来标识应用程序中的不同对象和同类中的不同的实例 诸如 一个窗口 按钮 图标 滚动条 输出设备 控件或者文件等 应用程序能够通过句
  • C/C++新建注册表项实例

    使用Windows API 函数中的RegCreateKeyEx函数来实现对注册表新建注册表项 RegCreateKeyEx函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 原形 LONG RegCreateKeyEx

随机推荐

  • c#中通过win32API(FindWindowEx)查找控件句柄实例

    函数功能 该函数获得一个窗口的句柄 该窗口的类名和窗口名与给定的字符串相匹配 这个函数查找子窗口 从排在给定的子窗口后面的下 一个子窗口开始 在查找时不区分大小写 函数原型 HWND FindWindowEx HWND hwndParent
  • c#中使用消息循环机制发送接收字符串的方法和数据类型转换

    在定义消息时忘记了用户可定义消息的边界值 xff0c 在网上一阵疯找后来发现是const int WM USER 61 0x400 接着是SendMessage的lParam类型不能决定 xff08 默认是IntPtr xff09 xff0
  • C#WebApi路由机制详解

    随着前后端分离的大热 WebApi在项目中的作用也是越来越重要 可单独部署 与前端和App交互都很方便 既然有良好的发展趋势 我们当然应该顺势而为 搞懂WebApi Restful相当于给Http请求增加了语义 Post 增 Delete
  • xubuntu(ubuntu)重启后不能进入图形化界面

    问题描述 xff1a Xbuntu启动后进入了 VMware Easy Install视图 xff0c 不能进入图形化界面 问题思路 xff1a 在命令行模式下命令联想敲击时会报硬盘容量不足 xff0c 怀疑可能和硬盘大小相关 先尝试清理下
  • JSON数据格式详解

    文章目录 JSON数据格式概念 JSON的简单数据 JSON对象 对象的属性也可以是JSON对象 JSON格式表示简单数组 对象数组 使用二维数组保存 二维数组 访问淘宝的接口也可以取得JSON格式的数据 将一个对象转换成JSON数据 将一
  • C# 创建一个简单的WebApi项目

    一 创建Web API 1 创建一个新的web API项目 启动VS 2013 并在 开始页 选择 新项目 或从 文件 菜单选择 新建 然后选择 项目 在 模板 面板中选择 已安装模板 并展开 Visual C 节点 选择该节点下的 Web
  • C# 编写Web API

    1 创建Web API项目 打开VS2012 gt FILE gt New gt Project gt Web gt ASP NET MVC 4 Web Application 修改名字为WebAPIApplication 单击OK 在Pr
  • C# WebApi 返回JSON类型

    在默认情况下 当我们新建一个webapi项目 会自动返回XML格式的数据 如果我们想返回JSON的数据 可以设置下面的三种方法 nbsp 1 不用改配置文件 在Controller的方法中 直接返回HttpResponseMessage p
  • c#通过HttpClient来调用Web Api接口

    lt summary gt HttpClient实现Post请求 异步 lt summary gt static async void dooPost string url http localhost 52824 api register
  • c#使用HttpClient调用WebApi

    调用WebApi 可以利用HttpClient来进行Web Api的调用 由于WebA Api的调用本质上就是一次普通的发送请求与接收响应的过程 xff0c 所有HttpClient其实可以作为一般意义上发送HTTP请求的工具 using
  • C#中通过HttpClient发送Post请求

    C 中HttpClient进行各种类型的传输 我们可以看到 尽管PostAsync有四个重载函数 但是接受的都是HttpContent 而查看源码可以看到 HttpContent是一个抽象类 那我们就不可能直接创建HttpContent的实
  • c#中WepAPI(post/get)控制器方法创建和httpclient调用webAPI实例

    一 xff1a WebAPI创建 using System using System Collections Generic using System Linq using System Net Http using System Text
  • c#中Task线程的用法

    1 Task的优势 ThreadPool相比Thread来说具备了很多优势 xff0c 但是ThreadPool却又存在一些使用上的不方便 比如 xff1a ThreadPool不支持线程的取消 完成 失败通知等交互性操作 xff1b Th
  • C# 中对象与JSON字符串相互转换的三种方法

    JSON JavaScript Object Notation JS 对象标记 是一种轻量级的数据交换格式 关于内存对象和JSON字符串的相互转换 xff0c 在实际项目中应比较广泛 xff0c 经过一番搜索 xff0c 找到如下三种方法来
  • 解决VM虚拟机中ubuntu系统上不了网的问题

    最简单的方式 关闭虚拟机在对应的虚拟机上右键 xff0c 点击设置 xff0c 找到网络适配器 xff0c 点击移除 xff0c 再次点击添加 xff0c 将网络适配器再次添加回来 xff0c 点击确定重启虚拟机 如果第一种方式解决不了问题
  • C#中创建圆形/按钮(使用重绘)

    创建圆形按钮挺简单的 public class EllipseButton Button protected override void OnPaint PaintEventArgs pevent GraphicsPath gPath 61
  • c#中控件重绘(放大缩小移动隐藏恢复后不消失)实例

    很重要 一定要重写并在在OnPaint 中用传入的pevent Graphics重绘 并且屏蔽掉父类的OnPaint方法 这样重绘后的图形不论控件怎么操作都不会消失了 using System using System Collection
  • WM_Paint 消息疑问解析

    1 系统何时发送WM PAINT消息 xff1f 系统会在多个不同的时机发送 WM PAINT 消息 xff1a 当第一次创建一个窗口时 xff0c 当改变窗口的大小时 xff0c 当把窗口从另一个 窗口背后移出时 xff0c 当最大化或最
  • Windows 消息ID及定义大全

    表A 1 Windows消息分布 消息范围 说 明 0 xff5e WM USER 1 系统消息 WM USER xff5e 0x7FFF 自定义窗口类整数消息 WM APP xff5e 0xBFFF 应用程序自定义消息 0xC000 xf
  • C++中消息机制阻塞实验

    VC6标准WIN32程序 xff0c Windows消息处理机制 xff1a 1 在注册窗口类时 xff0c 指定了消息处理函数WndProc 2 WinMain xff08 xff09 里有消息循环 xff1a while GetMess