Logga in
Googles appar
Huvudmeny
Post a Comment On:
cbloom rants
"07-09-10 - Backspace"
No comments yet. -
1 – 0 of 0
#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.
Download the EXE
posted by cbloom at
2:58 PM
on Jul 9, 2010
Leave your comment
You can use some HTML tags, such as
<b>, <i>, <a>
This blog does not allow anonymous comments.
Comment moderation has been enabled. All comments must be approved by the blog author.
Google Account
You will be asked to sign in after submitting your comment.
"07-09-10 - Backspace"
No comments yet. -