#define _WIN32_WINNT 0x0501 #define WIN32_LEAN_AND_MEAN #include<
windows.h> #include<
psapi.h> static bool strsame(const char * s1,const char * s2) { for(int i=0;;i++) { if ( s1[i] != s2[i] ) return false; if ( s1[i] == 0 ) return true; } } // __declspec(dllimport) void RtlFillMemory( void *, size_t count, char ); extern "C" void * __cdecl memset(void *buf,int val,size_t count) { char * p = (char *) buf; for(size_t i=0;i < count;i++) { p[i] = val; } return buf; } //#undef RtlCopyMemory //NTSYSAPI void NTAPI RtlCopyMemory( void *, const void *, size_t count ); extern "C" void * __cdecl memcpy(void *dst,const void *src,size_t count) { char * d = (char *) dst; char * s = (char *) src; for(size_t i=0;i < count;i++) { d[i] = s[i]; } return dst; } //int CALLBACK WinMain ( IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd ) int my_WinMain(void) { bool isExplorer = false; HWND active = GetForegroundWindow(); DWORD procid; DWORD otherThread = GetWindowThreadProcessId(active,&procid); if ( active ) { HWND cur = active; for(;;) { HWND p = GetParent(cur); if ( ! p ) break; cur = p; } char name[1024]; name[0] = 0; if ( GetClassNameA(cur,name,sizeof(name)) ) { //lprintf("name : %s\n",name); isExplorer = strsame(name,"CabinetWClass") || strsame(name,"ExploreWClass"); } } if ( isExplorer ) { //lprintf("sending alt-up\n"); INPUT inputs[4] = { 0 }; // this calls memset inputs[0].type = INPUT_KEYBOARD; inputs[0].ki.wVk = VK_LMENU; inputs[1].type = INPUT_KEYBOARD; inputs[1].ki.wVk = VK_UP; // send keyups in reverse order : inputs[2] = inputs[1]; // this generates memcpy inputs[3] = inputs[0]; inputs[2].ki.dwFlags |= KEYEVENTF_KEYUP; inputs[3].ki.dwFlags |= KEYEVENTF_KEYUP; SendInput(4,inputs,sizeof(INPUT)); } else { //lprintf("sending backspace\n"); // can't use SendInput here cuz it will run me again // find the actual window and send a message : DWORD myThread = GetCurrentThreadId(); AttachThreadInput(otherThread,myThread,TRUE); HWND focus = GetFocus(); if ( ! focus ) focus = active; // the HotKey thingy that I use will still send the KeyUp for Backspace, // so I only need to send the key down : // (some apps respond to keys on KeyUp and would process backspace twice- eg. Firefox) // also, if I send the KeyDown/Up together the WM_CHAR gets out of order oddly //PostMessageKeyUpDown(focus,VK_BACK); int vk = VK_BACK; int ScanKey = MapVirtualKey(vk, 0); const LPARAM lpKD = 1 | (ScanKey << 16); //const LPARAM lpKU = lpKD | (1UL << 31) | (1UL << 30); PostMessage(focus,WM_KEYDOWN,vk,lpKD); //PostMessage(w,WM_KEYUP,vk,lpKU); AttachThreadInput(otherThread,myThread,FALSE); } return 0; } extern "C" { int WinMainCRTStartup(void) { return my_WinMain(); } }
Bug fixed 07/12 : don't send key up message. Also, build without CRT and the EXE size is under 4k.
No comments:
Post a Comment