L
lamez
WINDOWS. Задача такая. Висит приложение в бэке (используем хук соотв), колбачит нажатие клавы. Нажалась кнопочка - установка даты на LPT и холодный неон завис в свете на 200мс.
Для задержки в свете неона - между выводами в порт числа ставим Sleep(200). Дело в том, что в самой функции CALLBACK KeyboardProc нельзя ставить эти операции, ибо клава будет тормозить, как и сама система. То есть так нельзя:
[codebox]LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode)
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
if(lParam>0)
{
Outb(888,1);
Sleep(200);
Outb(888,0);
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}[/codebox]
ТАК НЕЛЬЗЯ.
Я ламер и я решил запустить подпроцесс, или как он там называется))). CreateThread вобщем сделать)) и в этом подпроцессе следить за внешней переменной, которая бы устанавливалась в вышевыложенном колбаке. Ну и по условию в подпроцессе вывести в порт с задержкой.
Тоесть:
[codebox]
extern bool boleano_mego_alko_variable;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode)
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
if(lParam>0)
{
boleano_mego_alko_variable = true;
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}
DWORD WINAPI thproc(LPVOID lpParam){
while(1){
if(boleano_mego_alko_variable){
Out32(BASEPORT, 1);
Sleep(200);
Out32(BASEPORT, 0);
mego_alko_variable = false;
}
Sleep(10);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
if(!hi){
hi = hModule;
Out32(BASEPORT,0);
CreateThread( NULL, 0, thproc, NULL, 0, NULL);
}
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
[/codebox]
ОТНЮДЬ! Это тоже неправильно))). Подпроцесс не выполняется, [CENSORED], в таком случае на всех окнах, приложениях, а выполняется только тогда, когда я общаюсь с терминалом)).
ПОМОГИТЕ!!! Как мне еще можно выйти из этой ситуации.
Для задержки в свете неона - между выводами в порт числа ставим Sleep(200). Дело в том, что в самой функции CALLBACK KeyboardProc нельзя ставить эти операции, ибо клава будет тормозить, как и сама система. То есть так нельзя:
[codebox]LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode)
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
if(lParam>0)
{
Outb(888,1);
Sleep(200);
Outb(888,0);
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}[/codebox]
ТАК НЕЛЬЗЯ.
Я ламер и я решил запустить подпроцесс, или как он там называется))). CreateThread вобщем сделать)) и в этом подпроцессе следить за внешней переменной, которая бы устанавливалась в вышевыложенном колбаке. Ну и по условию в подпроцессе вывести в порт с задержкой.
Тоесть:
[codebox]
extern bool boleano_mego_alko_variable;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode)
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
if(lParam>0)
{
boleano_mego_alko_variable = true;
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}
DWORD WINAPI thproc(LPVOID lpParam){
while(1){
if(boleano_mego_alko_variable){
Out32(BASEPORT, 1);
Sleep(200);
Out32(BASEPORT, 0);
mego_alko_variable = false;
}
Sleep(10);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
if(!hi){
hi = hModule;
Out32(BASEPORT,0);
CreateThread( NULL, 0, thproc, NULL, 0, NULL);
}
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
[/codebox]
ОТНЮДЬ! Это тоже неправильно))). Подпроцесс не выполняется, [CENSORED], в таком случае на всех окнах, приложениях, а выполняется только тогда, когда я общаюсь с терминалом)).
ПОМОГИТЕ!!! Как мне еще можно выйти из этой ситуации.