1 /* --- The following code comes from c:\lcc\lib\wizard\dll.tpl. */
15 #include "openwidedll.h"
16 #include "openwidedllres.h"
18 #include "owSharedUtil.h"
21 HINSTANCE ghInst
= NULL
;
22 HANDLE ghMutex
= NULL
;
23 POWSharedData gpSharedMem
= NULL
; // pointer to shared mem
25 HHOOK ghMsgHook
= NULL
, ghSysMsgHook
= NULL
;
27 OWSharedData gOwShared
; // stores copy of shared mem for access to non-pointer datas without extended blocking
31 int addIcon2TB(HWND hwTB
, HICON hIcn
)
33 HIMAGELIST hImgList
= NULL
;
34 hImgList
= (HIMAGELIST
)SendMessage(hwTB
, TB_GETIMAGELIST
, 0, 0);
37 // int nImgs = ImageList_GetImageCount(hImgList);
38 int idxNew
= ImageList_AddIcon(hImgList
, hIcn
);
41 //dbg("%s, Error adding to imglist: %s", __func__, geterrmsg());
46 //dbg("%s, Image added at index %d", __func__, idxNew);
47 SendMessage(hwTB
, TB_SETIMAGELIST
, 0, (LPARAM
)hImgList
);
55 static int addTBButton(HWND hwnd
)
57 HWND hwTB
= findChildWindow(hwnd
, CID_TOOLBAR
, TOOLBARCLASSNAME
);
60 tb
.iBitmap
= VIEW_NETCONNECT
;
63 HICON hIcn
= (HICON
)LoadImage(ghInst
, MAKEINTRESOURCE(IDI_TBICON
), IMAGE_ICON
, 16, 16, 0);
66 idxNew
= addIcon2TB(hwTB
, hIcn
);
71 tb
.idCommand
= OW_TBUTTON_CMDID
;
72 tb
.fsStyle
= BTNS_AUTOSIZE
| BTNS_BUTTON
| BTNS_SHOWTEXT
| BTNS_DROPDOWN
; // BTNS_WHOLEDROPDOWN;
73 tb
.fsState
= TBSTATE_ENABLED
;
74 tb
.iString
= (INT_PTR
)"OpenWide by Lingo";
75 SendMessage(hwTB
, TB_ADDBUTTONS
, 1, (LPARAM
) & tb
);
78 int idxLast
= SendMessage(hwTB
, TB_BUTTONCOUNT
, 0, 0) - 1;
79 if (SendMessage(hwTB
, TB_GETITEMRECT
, idxLast
, (LPARAM
) & r
))
82 GetWindowRect(hwTB
, &rw
);
83 MapWindowPoints(hwTB
, NULL
, (LPPOINT
) & r
, 2);
84 SetWindowPos(hwTB
, NULL
, 0, 0, (r
.right
+ 8) - rw
.left
, rw
.bottom
- rw
.top
+ 1, SWP_NOMOVE
| SWP_NOZORDER
);
89 static void dropMenu(HWND hwnd
, HWND hwTB
, UINT uiItem
)
92 SendMessage(hwTB
, TB_GETRECT
, uiItem
, (LPARAM
) & r
);
93 MapWindowPoints(hwTB
, NULL
, (LPPOINT
) & r
, 2);
95 TPMPARAMS tpm
= { 0 };
96 tpm
.cbSize
= sizeof(tpm
);
99 HMENU hm
= CreatePopupMenu();
100 AppendMenu(hm
, MF_STRING
, OW_EXPLORE_CMDID
, "&Locate current folder with Explorer...");
101 AppendMenu(hm
, MF_STRING
, OW_SHOWDESK_CMDID
, "Show &Desktop [for Gabriel]...");
102 SetMenuDefaultItem(hm
, OW_SHOWDESK_CMDID
, FALSE
);
104 AppendMenu(hm, MF_STRING, OW_ADDFAV_CMDID, "Add &Favourite");
105 SetMenuDefaultItem(hm, OW_ADDFAV_CMDID, FALSE);
106 POWSharedData pow = lockSharedData();
109 dbg("%s, Locked shared data ok", __func__);
110 PFavLink pFav = pow->pFaves;
113 MENUITEMINFO mii = { 0 };
114 mii.cbSize = sizeof(mii);
115 AppendMenu(hm, MF_SEPARATOR | MF_DISABLED, 0, NULL);
116 for (int i = 0; i < pow->nFaves; i++)
118 pFav = getNthFave(pow, i);
121 static char szBuf[MAX_PATH + 8];
123 dbgLink("inserting...", pFav);
124 mii.fMask = MIIM_STRING | MIIM_DATA | MIIM_ID;
125 mii.fType = MFT_STRING;
126 wsprintf(szBuf, "%s\tCtrl+%d", pFav->szFav, (pFav->idCmd - OW_FAVOURITE_CMDID) + 1);
127 mii.dwTypeData = szBuf;
128 mii.dwItemData = pFav->idCmd;
129 mii.wID = pFav->idCmd;
131 int iRes = InsertMenuItem(hm, -1, TRUE, &mii);
133 dbg("%s, Failed inserting item: %s", __func__, geterrmsg());
134 //idx = AppendMenu(hm, MF_STRING, iCmd++, pFav->szFav);
137 unlockSharedData(pow);
140 AppendMenu(hm
, MF_SEPARATOR
| MF_DISABLED
, 0, NULL
);
141 AppendMenu(hm
, MF_STRING
, OW_ABOUT_CMDID
, "&About OpenWide...");
142 TrackPopupMenuEx(hm
, TPM_HORIZONTAL
| TPM_RIGHTALIGN
| TPM_LEFTBUTTON
| TPM_VERTICAL
, r
.right
, r
.bottom
, hwnd
, &tpm
);
146 int addPlace(HWND hwnd, PFavLink plk)
148 HWND hwTB = GetDlgItem(hwnd, CID_PLACES);
151 tb.iBitmap = giPlacesIcon;
152 tb.idCommand = plk->idCmd;
153 tb.fsStyle = BTNS_BUTTON | BTNS_SHOWTEXT; // BTNS_WHOLEDROPDOWN;
154 tb.fsState = TBSTATE_ENABLED;
155 tb.iString = (INT_PTR)PathFindFileName(plk->szFav);
156 SendMessage(hwTB, TB_ADDBUTTONS, 1, (LPARAM) & tb);
160 int addFavourite(HWND hwnd)
162 //static char szBuf[2*MAX_PATH+1];
163 assert( IsWindow(hwnd));
165 char *szBuf = (char *)GlobalAlloc(GPTR, 2 * MAX_PATH + 1);
168 if( SendMessage(hwnd, CDM_GETFOLDERPATH, 2*MAX_PATH, (LPARAM)szBuf) > 0 )
170 if( !faveExists(szBuf) )
172 PFavLink plNew = newFav(szBuf);
174 addPlace(hwnd, plNew);
176 dbg("%s, failed to create new fave", __func__);
179 dbg("%s, Fave: '%s' exists already", __func__, szBuf);
186 int openWide(HWND hwnd
)
188 dbg("DLL: openWide(%p)", hwnd
);
190 int w
= gOwShared
.szDim
.cx
;
191 int h
= gOwShared
.szDim
.cy
;
192 int x
= gOwShared
.ptOrg
.x
;
193 int y
= gOwShared
.ptOrg
.y
;
194 SetWindowPos(hwnd
, NULL
, x
, y
, w
, h
, SWP_NOZORDER
);
197 HWND hwDirCtl
= GetDlgItem(hwnd
, CID_DIRLISTPARENT
);
198 WORD vCmdID
= viewToCmdID(gOwShared
.iView
);
199 // dbg("Sending message to set view, cmd id %d", vCmdID);
200 SendMessage(hwDirCtl
, WM_COMMAND
, MAKEWPARAM(vCmdID
, 0), 0);
202 focusDlgItem(hwnd
, gOwShared
.iFocus
);
204 // debug hook, to find menu cmd IDs
206 dbg("Hooking SYSMSG...");
207 ghSysMsgHook
= SetWindowsHookEx(
211 0 //GetCurrentThreadId() // Only install for THIS thread!!!
213 dbg("Hooking returned %p", ghSysMsgHook
);
215 DragAcceptFiles(hwnd
, TRUE
);
216 //SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_CAPTION | WS_SYSMENU);
218 HMENU hm
= GetSystemMenu(hwnd
, FALSE
);
219 AppendMenu(hm
, MF_SEPARATOR
| MF_DISABLED
, 0, NULL
);
220 AppendMenu(hm
, MF_STRING
, OW_EXPLORE_CMDID
, "&Locate current folder with Explorer...");
221 AppendMenu(hm
, MF_STRING
, OW_ABOUT_CMDID
, "&About OpenWide...");
225 HWND hwShellCtl = GetDlgItem(hwnd, CID_DIRLISTPARENT);
226 hwShellCtl = GetDlgItem(hwShellCtl, 1);
227 ListView_SetExtendedListViewStyleEx(hwShellCtl, OW_LISTVIEW_STYLE, OW_LISTVIEW_STYLE );
229 HWND hwOv = createOverlayWindow(hwnd);
230 dbg("Created overlay window: %p", hwOv);
231 SetWindowPos(hwOv, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
232 SetActiveWindow(hwnd);
233 DragAcceptFiles(hwOv, TRUE);*/
237 void showDesktop(HWND hwnd
)
239 char * szDesk
= GlobalAlloc(GPTR
, MAX_PATH
+1);
240 if( szDesk
&& SHGetSpecialFolderPath(hwnd
, szDesk
, CSIDL_DESKTOPDIRECTORY
,FALSE
) )
242 char *szOld
= getDlgItemText(hwnd
, CID_FNAME
);
243 SetDlgItemText(hwnd
, CID_FNAME
, szDesk
);
244 SendDlgItemMessage(hwnd
, CID_FNAME
, EM_SETSEL
, -1, -1);
245 SendDlgItemMessage(hwnd
, CID_FNAME
, EM_REPLACESEL
, FALSE
, (LPARAM
)"\\");
246 SendMessage(hwnd
, WM_COMMAND
, MAKEWPARAM(IDOK
, BN_CLICKED
), (LPARAM
)GetDlgItem(hwnd
, IDOK
));
248 SetDlgItemText(hwnd
, CID_FNAME
, szOld
);
250 SetDlgItemText(hwnd
, CID_FNAME
, "");
256 LRESULT CALLBACK WINAPI
wpSubMain(HWND hwnd
, UINT msg
, WPARAM wp
, LPARAM lp
)
260 dbgWM(hwnd, msg, wp, lp);
262 POWSubClassData pow
= (POWSubClassData
)GetProp(hwnd
, OW_PROP_NAME
);
264 return DefWindowProc(hwnd
, msg
, wp
, lp
);
266 static char buffer
[MAX_PATH
+1];
272 dbg("DLL: INITDIALOG");
273 LRESULT lRes
= CallWindowProc(pow
->wpOrig
, hwnd
, msg
, wp
, lp
);
274 ShowWindow(hwnd
, SW_HIDE
);
279 if( wp
&& !pow
->bSet
)
287 LRESULT lRes = CallWindowProc(pow->wpOrig, hwnd, msg, wp, lp);
290 MoveWindow( GetDlgItem(hwnd, CID_OVERLAY), 0,0, w,h, FALSE);
298 MessageBox(hwnd
, "OpenWide is written by Luke Hudson. (c)2005", "About OpenWide", MB_OK
);
300 case OW_TBUTTON_CMDID
:
301 case OW_SHOWDESK_CMDID
:
304 case OW_EXPLORE_CMDID
:
306 char *szParm
= "/select,";
307 wsprintf(buffer
, szParm
);
308 int len
= strlen(szParm
);
309 LPARAM lpBuf
= (LPARAM
)buffer
+ (LPARAM
)len
;
310 dbg("CDM_GET..PATH, cbSize=%d, buffer = %p", MAX_PATH
-len
, lpBuf
);
311 len
= SendMessage(hwnd
, CDM_GETFOLDERPATH
, MAX_PATH
- len
, lpBuf
); //(LPARAM)(char *)((unsigned int)buffer + (unsigned int)len));
314 dbg("Getfolderpath returned len %d, path: \"%s\"",len
, buffer
);
315 ShellExecute(hwnd
, NULL
, "explorer.exe", buffer
, NULL
, SW_SHOWNORMAL
);
320 case OW_ADDFAV_CMDID:
324 if (LOWORD(wp) >= OW_FAVOURITE_CMDID)
326 getFavourite(hwnd, (int)LOWORD(wp));
334 NMHDR
*phdr
= (NMHDR
*)lp
;
335 HWND hwTB
= findChildWindow(hwnd
, CID_TOOLBAR
, TOOLBARCLASSNAME
);
336 if (phdr
->hwndFrom
== hwTB
)
338 // dbg("Got notify %d from toolbar", phdr->code);
339 if (phdr
->code
== TBN_DROPDOWN
)
341 NMTOOLBAR
*ptb
= (NMTOOLBAR
*)lp
;
342 if (ptb
->iItem
== OW_TBUTTON_CMDID
)
344 dropMenu(hwnd
, hwTB
, ptb
->iItem
);
345 return TBDDRET_DEFAULT
;
352 case WM_PARENTNOTIFY
:
353 if( LOWORD(wp
) == WM_CREATE
)
356 GetClassName((HWND
)lp
, buf
, 32);
358 if( strcmp(buf
, "SHELLDLL_DefView") == 0 )
360 // dbg("Shell defview ctl created");
361 // subclass((HWND)lp, wpSubShellCtl, (LPARAM)hwnd);
362 HWND hwLV
= GetDlgItem((HWND
)lp
, 1);
363 DragAcceptFiles(hwLV
, TRUE
);
366 if( GetWindowLong(hwLV
, GWL_STYLE
) & LVS_REPORT
)
368 //dbg("hwLV is in report mode -- setting extended style");
369 ListView_SetExtendedListViewStyleEx(hwLV
, OW_LISTVIEW_STYLE
, OW_LISTVIEW_STYLE
);
371 in
[0].type
= INPUT_KEYBOARD
;
372 in
[0].ki
.wVk
= VK_CONTROL
;
373 in
[1].type
= INPUT_KEYBOARD
;
374 in
[1].ki
.wVk
= VK_ADD
;
375 in
[2].type
= INPUT_KEYBOARD
;
376 in
[2].ki
.wVk
= VK_CONTROL
;
377 in
[2].ki
.dwFlags
= KEYEVENTF_KEYUP
;
378 in
[3].type
= INPUT_KEYBOARD
;
379 in
[3].ki
.wVk
= VK_ADD
;
380 in
[3].ki
.dwFlags
= KEYEVENTF_KEYUP
;
381 HWND hwOld
= SetFocus(hwLV
);
382 SendInput(4, in
, sizeof(INPUT
));
386 SetTimer(hwnd
, 251177, 1, NULL
);
393 KillTimer(hwnd, 251177);
394 HWND hwDirCtl = GetDlgItem(hwnd, CID_DIRLISTPARENT);
395 if( getSharedData() )
397 if( gOwShared.iView == V_THUMBS || gOwShared.iView == V_TILES )
399 // dbg("posting cmd message to reset view?");
400 WORD vCmdID = viewToCmdID(gOwShared.iView);
401 PostMessage(hwDirCtl, WM_COMMAND, MAKEWPARAM(vCmdID, 0), 0);
409 int cmdId
= wp
& 0xFFF0;
410 if( cmdId
== OW_ABOUT_CMDID
)
412 MessageBox(hwnd
, "OpenWide is written by Luke Hudson. (c)2005", "About OpenWide", MB_OK
);
415 else if( cmdId
== OW_EXPLORE_CMDID
)
417 char * szParm
= "/select,";
418 wsprintf(buffer
, szParm
);
419 int len
= strlen(szParm
);
420 len
= SendMessage(hwnd
, CDM_GETFOLDERPATH
, MAX_PATH
-len
, (LPARAM
)(buffer
+len
));
423 ShellExecute(hwnd
, NULL
, "explorer.exe", buffer
, NULL
, SW_SHOWNORMAL
);
430 NMHDR * phdr = (NMHDR *)lp;
431 HWND hwSV = GetDlgItem(hwnd, CID_DIRLISTPARENT);
432 hwSV = GetDlgItem(hwSV, CID_DIRLIST);
433 if( phdr->hwndFrom == hwSV )
435 dbg("Got notify %d from listview", phdr->code);
441 HDC hdc = GetWindowDC(hwnd);
444 hbrOld = SelectObject(hdc, GetStockObject(BLACK_BRUSH));
445 hpOld = SelectObject(hdc, GetStockObject(NULL_PEN));
447 GetWindowRect(hwnd, &r);
452 RoundRect(hdc, r.left, r.top, r.right, r.bottom, 16,16);
453 SelectObject(hdc, hbrOld);
454 SelectObject(hdc, hpOld);
455 ReleaseDC(hwnd, hdc);
460 HANDLE hDrop
= (HANDLE
)wp
;
461 int nFiles
= DragQueryFile(hDrop
, (UINT
)-1, NULL
, 0);
462 //dbg("%d files dropped on main window %p", nFiles, hwnd);
465 if( DragQueryFile(hDrop
, 0, buffer
, MAX_PATH
) )
467 if( PathIsDirectory(buffer
) )
469 SetDlgItemText(hwnd
, CID_FNAME
, buffer
);
470 SendDlgItemMessage(hwnd
, CID_FNAME
, EM_SETSEL
, -1, -1);
471 SendDlgItemMessage(hwnd
, CID_FNAME
, EM_REPLACESEL
, FALSE
, (LPARAM
)"\\");
472 SendMessage(hwnd
, WM_COMMAND
, MAKEWPARAM(IDOK
, BN_CLICKED
), (LPARAM
)GetDlgItem(hwnd
, IDOK
));
473 SetDlgItemText(hwnd
, CID_FNAME
, "");
474 if( getSharedData() )
476 focusDlgItem(hwnd
, gOwShared
.iFocus
);
485 //dbg("DLL: DESTROY");
486 if( openSharedMem() )
488 //dbg("DLL: Opened shared memory");
489 if( --gpSharedMem
->refCount
< 0 )
490 gpSharedMem
->refCount
= 0;
491 //dbg("DLL: dec'd refCount to %d, posting msg %x to app window %p", gpSharedMem->refCount, gpSharedMem->iCloseMsg, gpSharedMem->hwListener);
492 PostMessage( gpSharedMem
->hwListener
, gpSharedMem
->iCloseMsg
, 0,0);
494 //dbg("DLL: Closed shared memory");
496 WNDPROC wpOrig
= pow
->wpOrig
;
498 return CallWindowProc(wpOrig
, hwnd
, msg
, wp
, lp
);
502 return CallWindowProc(pow
->wpOrig
, hwnd
, msg
, wp
, lp
);
505 LRESULT CALLBACK WINAPI
wpSubShellCtl(HWND hwnd
, UINT msg
, WPARAM wp
, LPARAM lp
)
507 POWSubClassData pow
= (POWSubClassData
)GetProp(hwnd
, OW_PROP_NAME
);
509 return DefWindowProc(hwnd
, msg
, wp
, lp
);
515 HANDLE hDrop
= (HANDLE
)wp
;
516 int nFiles
= DragQueryFile(hDrop
, (UINT
)-1, NULL
, 0);
517 ////dbg("%d files dropped, fwding mesg to %p", nFiles, pow->lpData);
518 return SendMessage((HWND
)pow
->lpData
, msg
, wp
, lp
);
523 WNDPROC wpOrig
= pow
->wpOrig
;
525 //dbg("SHell view being destroyed");
526 return CallWindowProc(wpOrig
, hwnd
, msg
, wp
, lp
);
530 return CallWindowProc(pow
->wpOrig
, hwnd
, msg
, wp
, lp
);
533 static BOOL
isExcluded(const char *szApp
)
536 HKEY hk
= regOpenKey(HKEY_CURRENT_USER
, OW_REGKEY_EXCLUDES_NAME
);
539 regGetDWORD(hk
, szApp
, &bEx
);
546 static void dbgCreateParams(LPVOID lpCreateParams
)
548 UNALIGNED
short * pcbData
= (UNALIGNED
short *)lpCreateParams
;
551 short cbData
= * pcbData
;
552 UNALIGNED byte
*pbData
= (UNALIGNED byte
*)pcbData
;
553 pbData
+= sizeof(short);
554 dbg("**CreateParams:");
555 dbg(" %d bytes of data, starting at x%p", cbData
, pbData
);
558 dbg(" First 8 bytes follow:");
559 int len
= min( cbData
, 8 );
562 for(i
=0; i
< len
; i
++)
567 dbg(" \"%s\" (hex follows)", s
);
570 for(i
=0; i
< len
; i
++)
572 sprintf(st
, "%02x ", pbData
[i
]);
579 dbg("CreateParams is NULL (%p)", pcbData
);
582 static LRESULT CALLBACK
CBTProc(int nCode
, WPARAM wParam
, LPARAM lParam
)
588 return CallNextHookEx(ghMsgHook
, nCode
, wParam
, lParam
);
595 static char buf
[256];
596 HWND hwNew
= (HWND
)wParam
;
597 CBT_CREATEWND
* pcw
= (CBT_CREATEWND
*)lParam
;
598 CREATESTRUCT
* pcs
= (CREATESTRUCT
*) pcw
->lpcs
;
600 if( GetClassName(hwNew
, buf
, 255) && pcs
->lpszName
)
602 DWORD style
= (DWORD
)GetWindowLong(hwNew
, GWL_STYLE
);
603 DWORD exStyle
= (DWORD
)GetWindowLong(hwNew
, GWL_EXSTYLE
);
605 if( style
== OW_MATCH_STYLE
&& exStyle
== OW_MATCH_EXSTYLE
606 && strcmp(buf
, "#32770") == 0
607 && strcmp(pcs
->lpszName
, "Open") == 0 )
609 BOOL bTakeOver
= TRUE
;
611 //// FIND name of Calling app ////
612 char *szApp
= malloc( MAX_PATH
+1 );
613 if( szApp
&& GetModuleFileName(NULL
, szApp
, MAX_PATH
) )
615 if( isExcluded(szApp
) )
617 //dbg("DLL: Module: %s", szApp);
621 ///dbg("DLL: Found O&S dlg %p, attempting access to shared mem", hwNew);
623 if( bTakeOver
&& openSharedMem() )
625 //dbgCreateParams(pcs->lpCreateParams);
626 //dbg("DLL: Opened shared memory");
627 if( gpSharedMem
->bDisable
)
630 gpSharedMem
->refCount
++;
631 //dbg("DLL: Inc'd refCount to %d", gpSharedMem->refCount);
633 //dbg("DLL: Closed shared memory");
637 pcs
->style
&= ~WS_VISIBLE
;
638 ShowWindow(hwNew
, SW_HIDE
);
639 subclass(hwNew
, wpSubMain
, 0);
646 // Call the next hook, if there is one
647 return CallNextHookEx(ghMsgHook
, nCode
, wParam
, lParam
);
650 int openSharedMem(void)
652 if( ghMap
!= NULL
|| gpSharedMem
!= NULL
)
658 ghMap
= OpenFileMapping(FILE_MAP_WRITE
, TRUE
, OW_SHARED_FILE_MAPPING
);
661 gpSharedMem
= (POWSharedData
)MapViewOfFile(ghMap
, FILE_MAP_WRITE
, 0,0, 0);
664 CopyMemory(&gOwShared
, gpSharedMem
, sizeof(OWSharedData
));
673 void closeSharedMem(void)
677 UnmapViewOfFile(gpSharedMem
);
688 int getSharedData(void)
691 if( openSharedMem() )
700 int DLLEXPORT
setHook(void)
702 if(ghMsgHook
!= NULL
)
704 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Already hooked");
709 // SendMessage(hwLB, LB_ADDSTRING, 0, (LPARAM)"Failed to get shared data!!!");
710 // dbg("Hook failed to get shared mems");
713 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Setting hook....");
714 ghMsgHook
= SetWindowsHookEx(WH_CBT
, CBTProc
, ghInst
, 0);
715 if(ghMsgHook
!= NULL
)
717 //dbg("Hooked okay");
718 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Hooked ok!");
721 //dbg("Hook failed");
722 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Failed hook");
727 int DLLEXPORT
rmvHook(void)
734 UnhookWindowsHookEx(ghSysMsgHook
);
737 //dbg("DLL: Removing hook");
740 UnhookWindowsHookEx(ghMsgHook
);
743 //dbg("DLL: removed hook okay");
750 static LRESULT CALLBACK SysMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
755 return CallNextHookEx(ghMsgHook, nCode, wParam, lParam);
757 LPMSG pMsg = (MSG *)lParam;
758 if( pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST )
760 dbg("SysMsgProc: %d is code, pMsg: hwnd: %p, message: %d, wp: %x, lp: %x", nCode, pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
762 if( GetAsyncKeyState(VK_SHIFT) & 0x8000 )
764 LRESULT lRet = CallNextHookEx(ghSysMsgHook, nCode, wParam, lParam);
765 UnhookWindowsHookEx(ghSysMsgHook);
769 switch(pMsg->message)
773 dbg("WM_MENUSELECT: %p %d", pMsg->hwnd, LOWORD(pMsg->wParam));
775 HMENU hm = (HMENU)pMsg->lParam;
779 MENUITEMINFO mii ={0};
780 int nItems = GetMenuItemCount(hm);
781 dbg(" %d items in menu", nItems);
782 for(int i=0; i < nItems; i++)
784 mii.cbSize = sizeof(mii);
785 mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING;
787 mii.dwTypeData = (LPTSTR)buf;
788 GetMenuItemInfo(hm, i, TRUE, &mii);
789 dbg(" Item %d: %.8s, %d", i, buf, mii.wID);
793 UnhookWindowsHookEx(ghSysMsgHook);
800 // Call the next hook, if there is one
801 return CallNextHookEx(ghSysMsgHook, nCode, wParam, lParam);
805 BOOL DLLEXPORT WINAPI
DLLPROC(HINSTANCE hDLLInst
, DWORD fdwReason
, LPVOID lpvReserved
)
809 case DLL_PROCESS_ATTACH
:
812 case DLL_PROCESS_DETACH
: