Project1

标题: 关于MFC与Win32Hook的一个问题。 [打印本页]

作者: yangff    时间: 2011-12-19 20:06
标题: 关于MFC与Win32Hook的一个问题。
首先是吐槽:
WX你妹的Eb!程序猿,菜单自己花就算了,这次特么居然换成bcgcontrolbar了!!!
蛋疼啊!!!!
有傻么????用这玩意??
于是我淡定不能了。这货是MFC的东西……使用的时候bcgcontrolbar.Create(CMenu)然后自动销毁CMenu,
这你娃叫我怎么响应??我本着毕竟是MFC带的东西,还是用OnCommand响应的心情,尝试在Proc里面用
OnCommand,捕获事件……然后草民失败了。
在CBT里面建的菜单是灰色的混蛋!!!EnableMenuItem没有用啊没有用!!!
这是要闹哪样啊??
  1.         if(nCode==HCBT_CREATEWND)
  2.         {       
  3.                 // 请想办法鉴定是不是主窗口
  4.                 LPCBT_CREATEWND pstr=(LPCBT_CREATEWND)lparam;
  5.                 if (pstr->lpcs->hwndParent==0&&pstr->lpcs->hMenu!=0){
  6.                         FirstTime=false;
  7.                         hWnd=(HWND)wparam;
  8.                         oProc = SetWindowLong(hWnd,GWL_WNDPROC,(LONG)newWndProc);
  9.                         HMENU hm = pstr->lpcs->hMenu;
  10.                         hPop = CreatePopupMenu();
  11.                         AppendMenu (hPop,MF_STRING,(UINT_PTR)1000,L"管理(&A)");
  12.                         AppendMenu (hPop,MF_SEPARATOR,(UINT_PTR)1001,NULL);
  13.                         AppendMenu(hm,MF_POPUP,(UINT_PTR)hPop,L"插件(&P)");
  14.                         EnableMenuItem ((HMENU) hPop,0,MF_ENABLED);
  15.                         EnableMenuItem ((HMENU)hPop,1000,MF_ENABLED);
  16.                         EnableMenuItem ((HMENU)hm,1000,MF_ENABLED); //我真的不是到该弄哪个了……
  17.                 }
  18.         }
复制代码

VX的时候还可以
  1.         if (uMsg==WM_INITMENUPOPUP)
  2.         {
  3.                 EnableMenuItem ((HMENU) wParam,0,MF_ENABLED);
  4.                 //return 0;
  5.         }
复制代码

在ACE里面完全不能用啊没效果啊!!!!
求解释肿么办???
完整代码:
  1. // RMPlus.cpp : Defines the exported functions for the DLL application.
  2. //

  3. #include "stdafx.h"
  4. #include "hHookMonery.h"
  5. #include <string>
  6. bool Okay = false;
  7. LRESULT CALLBACK newWndProc( HWND hwnd,
  8.     UINT uMsg,
  9.     WPARAM wParam,
  10.     LPARAM lParam
  11.     )
  12. {
  13.        

  14.         if (uMsg==WM_COMMAND)
  15.         {
  16.                 //if (MPluginHost::Effect((long)LOWORD(wParam)))
  17.                 if (LOWORD(wParam)>=1000)
  18.                 {
  19.                         //if (wParam==1000)
  20.                         //MessageBox(0,L"hi",L"hi",0);
  21.                         //return 0;
  22.                         return 0;
  23.                 }
  24.                
  25.                
  26.         }

  27.         if (uMsg==WM_INITMENU)
  28.         {
  29.                 EnableMenuItem ((HMENU) wParam,1000,MF_ENABLED);
  30.                 //return 0;
  31.         }
  32.         if (uMsg==WM_INITMENUPOPUP)
  33.         {
  34.                 EnableMenuItem ((HMENU) wParam,0,MF_ENABLED);
  35.                 //return 0;
  36.         }
  37.         return CallWindowProc((WNDPROC)oProc,hwnd,uMsg,wParam,lParam);
  38. }
  39. bool FirstTime=true;
  40. LRESULT WINAPI cbthookproc(int nCode,WPARAM wparam,LPARAM lparam)
  41. {
  42.         if (GetCurrentProcessId ()!=hPid) return CallNextHookEx(hHook1,nCode,wparam,lparam);
  43.         //if (FirstTime)
  44.         if(nCode==HCBT_CREATEWND)
  45.         {       
  46.                 // 请想办法鉴定是不是主窗口
  47.                 LPCBT_CREATEWND pstr=(LPCBT_CREATEWND)lparam;
  48.                 if (pstr->lpcs->hwndParent==0&&pstr->lpcs->hMenu!=0){
  49.                         FirstTime=false;
  50.                         hWnd=(HWND)wparam;
  51.                         oProc = SetWindowLong(hWnd,GWL_WNDPROC,(LONG)newWndProc);
  52.                         HMENU hm = pstr->lpcs->hMenu;
  53.                         hPop = CreatePopupMenu();
  54.                         AppendMenu (hPop,MF_STRING,(UINT_PTR)1000,L"管理(&A)");
  55.                         AppendMenu (hPop,MF_SEPARATOR,(UINT_PTR)1001,NULL);
  56.                         AppendMenu(hm,MF_POPUP,(UINT_PTR)hPop,L"插件(&P)");
  57.                         EnableMenuItem ((HMENU) hPop,0,MF_ENABLED);
  58.                         EnableMenuItem ((HMENU)hPop,1000,MF_ENABLED);
  59.                         EnableMenuItem ((HMENU)hm,1000,MF_ENABLED);
  60.                 }
  61.         }
  62.         return CallNextHookEx(hHook1,nCode,wparam,lparam);
  63. }
  64. LRESULT WINAPI skinhookproc(int nCode,WPARAM wparam,LPARAM lparam)
  65. {

  66.         if (GetCurrentProcessId ()!=hPid) return CallNextHookEx(hHook,nCode,wparam,lparam);
  67.         CWPSTRUCT *msg = (CWPSTRUCT*)lparam;
  68.         if (msg->message==WM_CREATE)
  69.         {
  70.                
  71.                 wchar_t className[1024]={0};
  72.                 ::GetClassName(msg->hwnd,className,1024);
  73.                 //if (lstrcmp(className,L"Afx:00400000:b:00010003:00000006:016B31F3")){
  74.                 if (lstrcmp(className,L"Afx:00400000:b:00010003:00000006:053F11ED")==0&&!Okay){
  75.                         //hMenu = CreateMenu();
  76.                         //HMENU child = CreateMenu();
  77.                        
  78.                         //AppendMenu(hMenu,16,(UINT_PTR)child,L"Plugin");
  79.                         //SetMenu(GetParent(msg->hwnd),hMenu);}
  80.                         //SetMenu(msg->hwnd,hMenu);
  81.                         //hMenu=msg->hwnd;       
  82.                        
  83.                         //hWnd=(msg->hwnd);
  84.                         ///
  85.                                         //wchar_t wt[255];
  86.                 //wsprintf(wt,L"Installed %d",hMenu);
  87.                 //MessageBox(0,wt,L"Installed",0);
  88.                         ///
  89.                         //oProc = GetWindowLong(hWnd,GWL_WNDPROC);
  90.                         needInitProc=true;
  91.                         Okay=true;
  92.                 }

  93.                
  94.         }
  95.         if (needInitProc&&msg->message==WM_PAINT)
  96.         {
  97.                 /*wchar_t wt[255];
  98.                 wsprintf(wt,L"Installed %d",hMenu);
  99.                 MessageBox(0,wt,L"Installed",0);
  100.                
  101.                 TBBUTTON tb;
  102.                 ZeroMemory(&tb,sizeof(tb));
  103.                 tb.iBitmap=I_IMAGENONE ;
  104.                 tb.idCommand=133;
  105.                 tb.fsState=TBSTATE_ENABLED;
  106.                 tb.fsStyle|=TBSTYLE_LIST | BTNS_DROPDOWN;
  107.                 tb.iString=(INT_PTR)L"插件(&P)";
  108.                 SendMessage(hMenu,TB_BUTTONSTRUCTSIZE,sizeof(tb),0);
  109.                 SendMessage(hMenu,TB_ADDBUTTONS,1,(LPARAM)&tb);
  110.                 SendMessage(hMenu,TB_AUTOSIZE,0,0);
  111.                 hPop=CreateMenu();
  112.                 setg=CreateMenu();
  113.                 AppendMenu(hPop,16 | MF_POPUP,(UINT_PTR)setg,L"插件(&P)");
  114.         //        HMENU setg1=CreateMenu();
  115.                 AppendMenu(setg,MF_STRING,200,L"管理(&M)");*/
  116.                 needInitProc=false;
  117.                
  118.         //        MessageBox(0,L"setover",L"setover",0);
  119.                
  120.                
  121.         }
  122.         return CallNextHookEx(hHook,nCode,wparam,lparam);
  123. }
  124. void CreateMenus()
  125. {

  126. }
  127. int StartRM()
  128. {

  129.         STARTUPINFO sif;
  130.         PROCESS_INFORMATION pif;
  131.         ZeroMemory( &pif, sizeof(pif) );
  132.         ZeroMemory( &sif, sizeof(sif) );
  133.         sif.cb=sizeof(sif);
  134.         hHook = SetWindowsHookEx(WH_CALLWNDPROC,&skinhookproc,hMod,0);
  135.         hHook1 = SetWindowsHookEx(WH_CBT,&cbthookproc,hMod,0);
  136.         if (CreateProcess(L"RPGVXAce.exe",NULL,NULL,NULL,false,NORMAL_PRIORITY_CLASS,NULL,NULL,&sif,&pif))
  137.         {
  138.                 hPid=pif.dwProcessId;
  139.                 return (int)hHook;
  140.         }else
  141.                 return -2;
  142.         return -1;
  143. }
  144. int KillRM()

  145. {
  146.         //
  147.         UnhookWindowsHookEx(hHook1);
  148.         return UnhookWindowsHookEx(hHook);
  149. }
  150. BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  151. {
  152.    // printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);
  153.         hMod=hModule;
  154.     switch (ul_reason_for_call)
  155.     {
  156.         case DLL_PROCESS_ATTACH:{
  157.      //       printf("Process attach. \n");
  158.                        
  159.             break;
  160.                                                                 }
  161.         case DLL_PROCESS_DETACH:{
  162.        //     printf("Process detach. \n");
  163.                         break;}

  164.         case DLL_THREAD_ATTACH:
  165.          //   printf("Thread attach. \n");
  166.             break;

  167.         case DLL_THREAD_DETACH:
  168.            // printf("Thread detach. \n");
  169.                         break;
  170.     }

  171.     return (TRUE);
  172. }
复制代码
  1. #pragma once
  2. #include <Windows.h>
  3. #include "StdAfx.h"

  4. #pragma data_seg("YangffACESharedDataName")

  5. HHOOK hHook = 0;
  6. HHOOK hHook1 = 0;
  7. int hPid=0;

  8. HWND hWnd=0;
  9. bool needInitProc=false;
  10. HWND hMenu=0;
  11. HMENU hPop=0;
  12. long oProc=0;
  13. #pragma data_seg()
  14. HMODULE hMod =0;
  15. HMENU setg=0;

  16. #pragma comment(linker,"/section:YangffACESharedDataName,rws")
复制代码
  1. // stdafx.h : include file for standard system include files,
  2. // or project specific include files that are used frequently, but
  3. // are changed infrequently
  4. //

  5. #pragma once
  6. #ifndef YFFSTD
  7. #define YFFSTD 1
  8. #include <SDKDDKVer.h>


  9. // Windows Header Files:

  10. #include <windows.h>
  11. #include <stdio.h>
  12. #include <string>
  13. #include <CommCtrl.h>
  14. #include <map>
  15. #include <vector>
  16. extern HHOOK hHook ;
  17. extern int hPid;
  18. extern HHOOK hHook1 ;
  19. extern HWND hWnd;
  20. extern bool needInitProc;
  21. extern HWND hMenu;
  22. extern HMENU hPop;
  23. extern long oProc;
  24. extern HMODULE hMod;
  25. extern HMENU setg;
  26. // TODO: reference additional headers your program requires here

  27. #endif
复制代码
  1. LIBRARY RMPlusACE
  2. EXPORTS
  3. StartRM
  4. KillRM
复制代码
  1. require 'Win32API'
  2. require 'dl'
  3. require 'dl/callback'
  4. require 'dl/func'
  5. include DL
  6. alias o_exit exit
  7. def exit(*args)
  8. Win32API.new("RMPlusACE","KillRM","","i").call()
  9. o_exit(*args)
  10. end

  11. puts Win32API.new("RMPlusACE","StartRM","l","i").call(0)
  12. print "Please Press Enter before RPG Maker VX to exit me!!"
  13. gets
  14. Win32API.new("RMPlusACE","KillRM","","i").call()
复制代码

我真的想把效果做的好些啊!!!
作者: Sonic1997    时间: 2011-12-20 11:56
完全看不懂{:nm_2:}
作者: fux2    时间: 2011-12-20 12:39
你又想插菜单么。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1