首页
社区
课程
招聘
[原创]+开源.时间修改小工具PlusPLus
2006-9-27 17:55 6190

[原创]+开源.时间修改小工具PlusPLus

2006-9-27 17:55
6190
以前在工具下载栏目里面发过一个时间修改的小程序了,不过是用mfc写的,静态编译之后程序变得好大...3xxk....
现在重新用sdk写了一遍,静态编译之后44k...哈哈...
其实可以更小的..不过下次再更新吧..

其实发到这儿来主要是想问下高手一个问题...为什么我这个程序怎么样都收不到
const UINT s_uTaskbarRestart=RegisterWindowMessage(TEXT("TaskbarCreated"));
消息的?我重新建立其它程序都可以,我这个程序怎么样都收不到,郁闷死了......我就是想在任务栏重启之后可以看到我的systrayicon重新添加了...死活看不到...调试发现我的程序收不到这个消息..有没有高手可以改一下我的程序哦?告诉我怎么搞啊?..谢谢拉....

ps:我上个帖子的地址...
http://bbs.pediy.com/showthread.php?s=&postid=215751

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (12)
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 2006-9-27 17:57
2
0
其实我不是不google的人
我查过msdn了~上面也说了~但是代码放到我的程序里面就是不起作用...我郁闷死....
我新建一个窗口或者对话框都可以响应这个消息.....
就是加到我的工程之后一点反映都没有...
有高手可以帮下我吗?
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
红火蚁 3 2006-9-27 21:52
3
0
我给别人说的这个资料
你看看阿,不知道有没有用
你在窗口Test中定义的消息
你想把它发送到GetMsg这个窗口中
TestMsg这个是个钩子Dll
TestDll是调用这个全局钩子的程序

首先你在Test中定义全局的消息
UINT uMsg = RegisterWindowMessage("xxx");
在它上面加上一个按扭Button1
(由于我是在那个getMsg的View类中定义的消息处理
所以我在按扭中要找到TestMsg的客户窗口
在按扭的消息处理函数中写上:
void CTestDlg::OnButton1()
{
  // TODO: Add your control notification handler code here
  if (uMsg == 0)
  {
    MessageBox(TEXT("NO message"));
    return ;
  }
  HWND hWnd = ::FindWindow(NULL, "无标题 - GetMsg");
  if (hWnd == NULL)
  {
    MessageBox(TEXT("No Window"));
    return ;
  }
  ::SetForegroundWindow(hWnd);
//找到客户窗口
  HWND hwnd = ::FindWindowEx(hWnd, NULL, "AfxFrameOrView42d", NULL);
  if (hwnd == NULL)
  {
    MessageBox(TEXT("没有找到客户窗口"));
  }
  CWnd *pWnd = CWnd::FromHandle(hwnd);
//发送消息
  pWnd->SendMessage(uMsg);
}
染后在来看看这个TestMsg程序
我在它的View里定义全局消息
UINT uMsg2 = ::RegisterWindowMessage("xxx");
在GetMsgView.h中定义
protected:
  //{{AFX_MSG(CGetMsgView)
    // NOTE - the ClassWizard will add and remove member functions here.
    //    DO NOT EDIT what you see in these blocks of generated code !
  //}}AFX_MSG
  afx_msg void OnMsg2();
  DECLARE_MESSAGE_MAP()

在GetMsgView.cpp中定义
BEGIN_MESSAGE_MAP(CGetMsgView, CView)
  //{{AFX_MSG_MAP(CGetMsgView)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //    DO NOT EDIT what you see in these blocks of generated code!
  //}}AFX_MSG_MAP
  // Standard printing commands
  ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  ON_REGISTERED_MESSAGE(uMsg2, OnMsg2)//这个一定要用这个ON_REGISTERED_MESSAGE,其他的什么ON_MESSAGE是不行的,我就在这花了一些时间,最后在MSDN里查到了
END_MESSAGE_MAP()

void CGetMsgView::OnMsg2()
{
//消息处理
  MessageBox(TEXT("收到消息"));
}

在哪个TestMsg中写上
HHOOK g_hook = NULL;
UINT uMsg1 = ::RegisterWindowMessage("xxx");

LRESULT CALLBACK CallWndProc(
              int nCode,      // hook code
              WPARAM wParam,  // current-process flag
              LPARAM lParam   // address of structure with message data
            )
{
    if (nCode == HC_ACTION)
  {
    CWPSTRUCT *pMsg = (CWPSTRUCT*)lParam;
    if (pMsg->message == uMsg1)
    {
        MessageBox(NULL, TEXT("拦截到消息"), NULL, MB_OK);
    }
  }
  return CallNextHookEx(g_hook, nCode, wParam, lParam);
}

extern "C" _declspec(dllexport) void SetHook()
{
  g_hook = SetWindowsHookEx(
                WH_CALLWNDPROC,        // type of hook to install
                CallWndProc,     // address of hook procedure
                theApp.m_hInstance,    // handle to application instance
                0   // identity of thread to install hook for
              );
  if (g_hook == NULL)
  {
    MessageBox(NULL, TEXT("failed Set Hook"), NULL, MB_OK);
    return ;
  }

}

extern "C" _declspec(dllexport) void EndHook()
{
  if (g_hook != NULL)
  {
       UnhookWindowsHookEx(g_hook);
     g_hook = NULL;
  }
}

然后你在哪个TestDll中加2个按扭
extern "C" _declspec(dllimport) void SetHook();
extern "C" _declspec(dllimport) void EndHook();

void CTestDllDlg::OnButton1()
{
  // TODO: Add your control notification handler code here
  SetHook();
}

void CTestDllDlg::OnButton2()
{
  // TODO: Add your control notification handler code here
  EndHook();
}

OK
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 2006-9-27 22:09
4
0
最初由 红火蚁 发布
我给别人说的这个资料
你看看阿,不知道有没有用
你在窗口Test中定义的消息
你想把它发送到GetMsg这个窗口中
TestMsg这个是个钩子Dll
........


谢谢阿~~~我是这样的,随便找个sdk写的窗口程序...
都可以,就我的不行..
把他的sdk程序改成我自己的...
还是不行...(改了之后窗口显示不出来,要不就失去窗口消息..)
有没有人修改一下我的程序可以支持得到任务栏重建的消息啊..
郁闷死了~~~
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 2006-9-27 22:10
5
0
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam,
                         LPARAM lParam)
{
    static UINT s_uTaskbarRestart;

    switch(uMessage)
    {
        case WM_CREATE:
            s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
            break;
        
        default:
            if(uMessage == s_uTaskbarRestart)
                AddTaskbarIcons();
            break;
    }

    return DefWindowProc(hWnd, uMessage, wParam, lParam);
}

我用的方法`~~
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 2006-9-27 22:15
6
0
我真的很郁闷啊~~什么方法都试过了~~~~
把别人窗口做的sdk程序用这个方法都行...
我的怎么都收不到这个消息....
不知道为什么........
真心求救阿...............
希望有人告诉我修改哪里啊?
哭了.......................
雪    币: 214
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
RyoKou 1 2006-9-27 22:53
7
0
修改为这样试试
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam,
                         LPARAM lParam)
{
    static UINT s_uTaskbarRestart;

    switch(uMessage)
    {
        case WM_CREATE:
            s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
            break;
        
        default:
            break;
    }
    if(uMessage == s_uTaskbarRestart)
                AddTaskbarIcons();

    return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 2006-9-27 23:31
8
0
最初由 RyoKou 发布
修改为这样试试
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam,
LPARAM lParam)
{
static UINT s_uTaskbarRestart;
........

还是不行啊...高手麻烦看下我这个工程好不好?
加入到WM_INITDIALOG
也不行
根本收不到这个消息..
高手帮帮我~~我是想学下sdk熟悉一下程序...
雪    币: 214
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
RyoKou 1 2006-9-28 08:47
9
0
UINT s_uTaskbarRestart;

BOOL CALLBACK MainDlgProc(HWND hWnd, UINT Message, WPARAM wPa, LPARAM lPa)
{
        HDROP hDropInfo;
        TCHAR Source[THE_MAXPATH];
        TCHAR Obj[THE_MAXPATH];
        BOOL rez=false;
       
        switch(Message)
        {
        case SWM_TRAYMSG:
                switch(lPa)
                {
                case WM_LBUTTONDOWN:
                        ShowWindow(hWnd,SW_SHOW);
                        Shell_NotifyIcon(NIM_DELETE,&niData);
                        break;
                default:
                    break;
                }
        case WM_SYSCOMMAND:
                if((wPa) == SC_MINIMIZE)
                {
                        ShowWindow(hWnd, SW_HIDE);
                        Shell_NotifyIcon(NIM_ADD,&niData);
                        return 1;
                }
                break;
/*********************/
        case WM_INITDIALOG:
                //注册explorer restart消息
                s_uTaskbarRestart=RegisterWindowMessage(TEXT("TaskbarCreated"));
                CheckRadioButton(hWnd,IDC_ONLY,IDC_ALL,IDC_ONLY);
                break;

        case WM_COMMAND:
                switch(LOWORD(wPa))
                {
                case IDOK:
                        GetDlgItemText(hWnd,IDC_OBJ,Obj,THE_MAXPATH);
                        GetDlgItemText(hWnd,IDC_SOURCE,Source,THE_MAXPATH);
                        if (Obj[0]==0||Source[0]==0)//判断是不是NULL
                        {
                                MessageBox(hWnd,TEXT("缺少条件!"),TEXT("警告!"),MB_OK);
                                break;
                        }

                        if (PathIsDirectory(Obj))
                        {
                                if (SendMessage(GetDlgItem(hWnd,IDC_ONLY),BM_GETCHECK,0,0)==BST_CHECKED)
                                {
                                        rez=ChangeTime(Obj,Source);
                                }
                                if (SendMessage(GetDlgItem(hWnd,IDC_ALL),BM_GETCHECK,0,0)==BST_CHECKED)
                                {
                                        rez=ChangeWholeDirTime(Obj,Source,1);
                                }
                                if (SendMessage(GetDlgItem(hWnd,IDC_IGNORE),BM_GETCHECK,0,0)==BST_CHECKED)
                                {
                                        rez=ChangeWholeDirTime(Obj,Source,2);
                                }
                        }
                        else
                        {
                                CheckRadioButton(hWnd,IDC_ONLY,IDC_ALL,IDC_ONLY);
                                rez=ChangeTime(Obj,Source);
                        }
                        if (rez)
                        {
                                MessageBox(hWnd,TEXT("似乎成功了?"),TEXT("Bingo!"),MB_OK);
                        }
                        else
                        {
                                MessageBox(hWnd,TEXT("失败了阿..."),TEXT("遗憾!"),MB_OK);
                        }

                        break;
                case WM_CLOSE:
                case IDCANCEL:
                        ExitProcess(0);
                        break;
                default:
                        return 0;
                }
                break;
        case WM_DROPFILES:
                hDropInfo=(HDROP)wPa;
                OnDropFiles(hWnd,hDropInfo);
                break;
/*********************/
        default:
                //任务栏重建消息
                if (Message==s_uTaskbarRestart)
                {
                        Shell_NotifyIcon(NIM_ADD,&niData);
                }
                else
                        DefWindowProc(hWnd,Message,wPa,lPa);
        }
        return FALSE;

}
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Intelfan 2006-9-28 09:33
10
0
你把窗口和对话框用错了,窗口的处理和对话框的处理是不一样的。对话框中是不需要调用DefWindowProc(hWnd, uMessage, wParam, lParam);的,否则什么奇怪地事情都会发生。

BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)       
{
        switch ( uMsg )
        {
        case WM_INITDIALOG:
                return TRUE;

        case WM_COMMAND:
                switch( LOWORD(wParam) )
                {
                case IDCANCEL:
                case IDOK:
                        EndDialog( hwndDlg, 0 );
                        return TRUE;
                }
        }
        return FALSE;
}
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 2006-9-28 11:31
11
0
最初由 Intelfan 发布
你把窗口和对话框用错了,窗口的处理和对话框的处理是不一样的。对话框中是不需要调用DefWindowProc(hWnd, uMessage, wParam, lParam);的,否则什么奇怪地事情都会发生。

BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch ( uMsg )
........

这个问题我真的很郁闷啊`~~我参照了几个dialog的例子....
都可以,她们也是最后调用调用DefWindowProc的阿`~~
我按照你们的改了,还是一眼....其它反映都有....
就是收不到这个消息...真的郁闷死了...
你们可以用vc2005编译一下看看...我真的郁闷死了...初学遇到这么奇怪的问题........
上传的附件:
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 2006-9-28 11:38
12
0

现在解决这个问题啦~~
综合 RyoKou 和Intel的提醒!十分感谢阿!
首先不能有return DefWindowProc()..
然后改成这个样子
        default:
                if (Message==s_uTaskbarRestart)
                {
                        Shell_NotifyIcon(NIM_ADD,&niData);
                }
                else
                        return false;
        }

但是我还是有疑问...
例如我在楼上上传的例子...
都可以得阿....他也有DefWindowProc的阿?
奇怪了...
还有啊`~msdn里面说了createdialog其实就是调用createwindow
具体怎么调用的?有这方面的资料吗?

对了~~~~大侠可不可以留下qq阿?
我的qq:102832962
多多交流
雪    币: 450
活跃值: (552)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
winndy 17 2006-9-28 15:49
13
0
学习。
游客
登录 | 注册 方可回帖
返回