请问是否可以在windows中发送windows消息呢?比如说可以有个 PostMessage();的函数可以用呢?应该怎样让样应用程序知道数据库中的表有即事插入的数据?
如果我要PostMessage到一个窗口句柄 hwnd需要怎样做呢?
谢谢

解决方案 »

  1.   

    请问是否可以在windows中发送windows消息呢?
    当然可以发送了~~~
    比如说可以有个 PostMessage();的函数可以用呢?
    BOOL PostMessage(          HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
    );
    直接指定具体的hWnd,以及具体要发送的消息Msg就可以了~~~
    有即事插入的数据?
    什么意思??
      

  2.   

    不要意思~因该是在 MS-SQL中的触发器中发送消息给应用程序~
      

  3.   

    用vc写个扩展存储过程给sql调用。扩展存储过程很好写的,vc6可以从向导生成框架
      

  4.   

    对阿~是这样做了~可是MSSQL在调用存储过程的时候就是PosMessage 失败~代码是:SRVRETCODE xp_srv_paraminfo_sample( SRV_PROC* pSrvProc)
    {
    int         nParams;
    SRVRETCODE  rc = XP_NOERROR;
    char* c[14];

    // Count up the number of input parameters 重MSSQL 得到参数的个数
    nParams = srv_rpcparams(pSrvProc);
    if (nParams == -1)
        {
    return (XP_ERROR);
        }

    BYTE         bType;
    unsigned long cbMaxLen;
    unsigned long cbActualLen;
    BOOL fNull;
    bool rt = false;
    int i;          //得到参数值
    for( i=1;i<=nParams;i++)
    {
    int ret = srv_paraminfo(pSrvProc, i, &bType, &cbMaxLen, &cbActualLen,
    NULL, &fNull);

    if (cbActualLen)
    {
    //char srt[3] = {0x0d, 0x0a, 0};
    char srt[1] = {0};
    c[i] = new char[cbActualLen + 1];
    if (!c[i])return XP_ERROR;

    ZeroMemory(c[i], cbActualLen + 1);
    memcpy(c[i], srv_paramdata(pSrvProc, i), cbActualLen);
    memcpy(c[i]+cbActualLen, srt, 1);
    }
    }
    int res;
    if(PostMessage(hwnd,iMsg,NULL,NULL)) //成功发送即返回SUCCESS
               printError(pSrvProc,"SUCCESS");
             else
               printError(pSrvProc,"ERROR");

    // Free dynamically allocated memory.*/
    for( i=1;i<=nParams;i++)
    delete []c[i];
          return (rc);
    }============================================然后我在 查询分析器下输入
    exec master.dbo.xp_srv_paraminfo_sample  'test'
    就是返回 "ERROR"也就是说无法发送消息在这里PostMessage中的 hwnd和iMsg 我是用共享内存先存入
    hwnd就是我的应用程序的窗口句柄,iMsg就是我需要的消息可是我在写另一个测试程序也是共用这个dll就可以成功发送给我的应用程序
      

  5.   

    CDialogDlg dTest;
    dTest.GetSafeHwnd();
    获得CDialogDlg的窗口句柄
    或者用dTest.mhWnd;
    然后再结合
    BOOL PostMessage(          HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
    );
      

  6.   

    出错了容易找原因呀,在postmessage之前先检查所有的参数,看看是否你预期的。如果是预期的,再GetLastError看看什么错误。也许是因为sql server是服务,服务里边调用窗口相关函数有什么特殊之处?因为服务可以在系统还没登录时就启动
      

  7.   

    恩~我也有
    printError
    exec master.dbo.xp_srv_paraminfo_sample  'test'
    返回
    存储过程中postmessage的两个参数 hwnd iMsg
    都是我之前窗口hwnd=CreateDialog时的 hwnd和我需要的iMsgT_T
      

  8.   

    如果还不行,我告诉你一个100%能解决你的问题的办法。 在存储过程中,把自己的标记发送到消息队列中去。(注意是“消息队列”,MSMQ,它和windows消息没有任何联系,虽然名字很像。)然后写一个监控消息队列的程序,拿到自己的标记后,再PostMessage。 这样绝对可以,不过有些绕道。
      

  9.   

    消息队列中的消息,分2个部分,label和body,label有长度限制,body可以放很长的东西,如果光用label不用body,是很简单的。对于你的需求,label足够了。但是具体的代码我现在没有,因为代码在公司很抱歉了。另外希望你能帮忙研究下我的一个困惑,扩展存储过程的dll,在sqlserver服务运行的时候,不能删除也不能覆盖,这很正常吧。但奇怪的是它却可以剪贴实在搞不懂。
      

  10.   

    恩~我也有过。。有时sqlmangr在启动的时候~我可以随意更换、删除我的扩展存储过程~但是当我在查询分析器中我exec 扩展存储过程后就不可以在更改~我的理解是~存储过程作为一个动态链接库(dll)本身就是动态链接~当它需要执行到的时候才会被加载~谢谢jun_01(无名小卒) 可以给我代码~我的MSM是[email protected] 可以和我联系么?
      

  11.   

    早就该那样了,我还特地找了段代码给你,现在看来没用了:
    WID=OpenWindowStation("Winsta0",false,MAXIMUM_ALLOWED);  
       SetProcessWindowStation(WID);  
       DID=OpenDesktop("Default",0,false,MAXIMUM_ALLOWED);  
       SetThreadDesktop(DID);  
      

  12.   

    用那个叫WM_COPYDATA什么的不行吗?