hmm, imho rowniez dyskusji nie powinno konczyc samo znikniecie problemu, lecz wyeliminowanie przyczyny - pozniej sie siedzi dwa dni na googlarce i kupe znajduje;)
co do kodu, to mniej wiecej tak:
globalnie:
void * Hook;
UINT IPCmsg;
const int firstButton = 116;
const int secondButton = 57;
typedef struct {
int aType;
char path[255];
char params[255];
int PM_action;
} TButtonConfig;
typedef TButtonConfig TConfig[2];
//-------
przy starcie:
IPCmsg = RegisterWindowMessage(IPCmsgID); // IPCmsgID = "mpk_cswalkeralt_settingschanged"
Hook = SetWindowsHookEx(13, (HOOKPROC)HandleEvent, HInstance, 0); // 13 - WH_KEYBOARD_LL
ReadConfig(); // pobranie konfiguracji z rejestru - zadnych rewelacji.
//-------
obsluga Hook'a:
HOOKPROC HandleEvent(int iCode, WPARAM wParam, LPARAM lParam){
if(iCode < 0) return (HOOKPROC)CallNextHookEx(Hook, iCode, wParam, lParam);
EVENTMSG *pEvt = (EVENTMSG *)lParam;
if ( (pEvt->message == 255) && (pEvt->paramH == 129)){
if (pEvt->paramL == secondButton){
ButtonAction(1);
}else if (pEvt->paramL == firstButton){
ButtonAction(0);
}
}
return (HOOKPROC)CallNextHookEx (Hook, iCode, wParam, lParam);
}
//-----
void ButtonAction(int num){
//SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
switch (frmMain->config[num].aType){
case 0:
{
if (FileExists(frmMain->config[num].path)){
ShellExecute(0, "open", frmMain->config[num].path, frmMain->config[num].params, NULL, SW_SHOWNORMAL);
}
break;
}
// dalej obsluga innych typow akcji - nie interesuje nas;)
//SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0x30D40, (LPVOID)0, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
}
//----
no i ogsluga komunikatow:
void __fastcall TfrmMain::WndProc(TMessage &Message){
if (Message.Msg == IPCmsg)
ReadConfig();
TForm::WndProc(Message);
}
jak widac kod pod borlanda, ale bawilem sie tez DevCpp pod gcc4 - efekt ten sam - wywolane przez moja aplikacje okienka zostaja foreground tylko gdy moja aplikacja miala focus.