Witam! Spotkało mnie ciekawe, ale problematyczne zdarzenie. Otóż kod programu poniżej zamieszczony pomiędzy gwiazdkami, nie działa a kod robiący to samo w pętli switch sprawuje się wyśmienicie. Musi więc być jakaś róznica miedzy dwoma sposobami. Jaka?
#include <windows.h>
#include <stdio.h>
#include "resource.h"
long int ilosc_temp,diff;
HMODULE hKBHookDLL;
typedef void (*LPSetKBHook)(void);
LPSetKBHook SetKBHook = NULL;
typedef unsigned long (*LPGetKeyStrokes)(void);
LPGetKeyStrokes GetKeyStrokes = NULL;
typedef unsigned long (*LPGetKeyCounter)(void);
LPGetKeyCounter GetKeyCounter = NULL;
typedef void (*LPKillKBHook)(void);
LPKillKBHook KillKBHook = NULL;
BOOL LoadHookDLL()
{
hKBHookDLL = LoadLibrary("def.dll");
if (!hKBHookDLL) return(0);
SetKBHook = (LPSetKBHook)GetProcAddress(hKBHookDLL, "SetKBHook");
if (!SetKBHook) return(0);
GetKeyStrokes = (LPGetKeyStrokes)GetProcAddress(hKBHookDLL, "GetKeyStrokes");
if (!GetKeyStrokes) return(0);
GetKeyCounter = (LPGetKeyCounter)GetProcAddress(hKBHookDLL, "GetKeyCounter");
if (!GetKeyCounter) return(0);
KillKBHook = (LPKillKBHook)GetProcAddress(hKBHookDLL, "KillKBHook");
if (!KillKBHook) return(0);
SetKBHook();
return(1);
}
void FreeHookDLL()
{
KillKBHook();
FreeLibrary(hKBHookDLL);
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
long int ilosc_zn;
switch(msg)
{
case WM_INITDIALOG:
if (!LoadHookDLL()) EndDialog(hDlg, 0);
SetTimer(hDlg, 0, 3, NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_OK: EndDialog(hDlg, 0); break;
}
break;
case WM_TIMER:
switch(wParam)
{
case 0:
HWND hTmp = GetDlgItem(hDlg, IDC_EDIT1);
char str[50];
sprintf(str, "%d", GetKeyStrokes());
ilosc_zn=GetKeyCounter();
if(ilosc_zn!=ilosc_temp)
{
diff=ilosc_zn-ilosc_temp;
ilosc_temp=ilosc_zn;
} else diff=0;
SetWindowText(hTmp, str);
break;
}
break;
case WM_DESTROY:
FreeHookDLL();
break;
}
return(0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//*******************************
if (LoadHookDLL()) //działa
{
while(!GetKeyCounter()) //zwraca cały czas 0 więc program w tym miejscu się zapętla
{ };
}
//************************************
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
return(1);
}