关于一个抽奖程序在循环滚动中按下回车键或者按下停止按钮让循环停止的实现
七岁小鬼 2008-10-10 03:33:56 单位要小弟我做一个简单的抽奖程序。
实现基本也很简单,一个按钮开始抽奖,另一个按钮按下后就抽出一个号码。
但是小弟在实现过程中发现按下开始按钮后(本来是BUTTON1),停止按钮却怎么也按不了了(停止按钮本来是BUTTON2)。
于是上网搜罗了一下,想换为键盘钩子HOOK来实现预期目的;结果换为键盘钩子后发现问题依旧!!!
在抽奖的过程中按下回车键,只能实现在整个for循环完毕后sign的值才会改变。。。
完蛋了。。。无语了。。。希望那位大侠可以拉兄弟一把啊。。。感谢感谢!!!
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma link "Excel_2K_SRVR"
//---------------------------------------------------------------------------
static HINSTANCE hDLL; // DLL句柄
typedef void __stdcall (*DLLFUN)(HWND,bool);
DLLFUN DLLSetHook;
static const myMessage=2000;
static const SecondPar=1;
//---------------------------------------------------------------------------
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
AnsiString ExcelFileName = GetCurrentDir()+"\\source_file\\test.xls";
if(!FileExists(ExcelFileName))
{
Application->MessageBox("报表模板文件不存在,无法打开!","错误",MB_ICONSTOP|MB_OK);
return;
}
try
{
Ex = Variant::CreateObject("Excel.Application");
}
catch(...)
{
Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK);
return;
}
Ex.OlePropertySet("Visible",false);
Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str());
Wb = Ex.OlePropertyGet("ActiveWorkBook");
Sheet = Wb.OlePropertyGet("ActiveSheet");
hDLL=LoadLibrary((LPCTSTR)"Project2.dll"); // DLL文件名:Project2.dll
if(hDLL==NULL)
{
ShowMessage("DLL: 不能加载!程序退出。");
exit(1);
}
DLLSetHook = (DLLFUN)GetProcAddress(hDLL,"SetHook");
if(DLLSetHook==NULL)
{
ShowMessage("DLL: 函数没找到!程序退出。");
FreeLibrary(hDLL);
exit(1);
}
DLLSetHook(this->Handle,true);
sign = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=1;i<=100;i++)
{
for(int j=1;j<=10;j++)
ST1->Caption = Sheet.OlePropertyGet("Cells",i,1).OlePropertyGet("Value");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Wb.OleProcedure("Close");
Ex.OleFunction("Quit");
DLLSetHook(NULL,false); // 卸下HOOK
FreeLibrary(hDLL); // 卸下DLL
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for(int i=1;i<=100;i++)
{
if (sign == 0)
for(int j=1;j<=10;j++)
ST1->Caption = Sheet.OlePropertyGet("Cells",i,1).OlePropertyGet("Value");
}
}
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
if((Msg.message==WM_KEYDOWN)&&(Msg.wParam==13))
sign = 1;
//ShowMessage(" 收到HOOK按键消息!\n\n 【键虚拟码】:"+IntToStr(Msg.wParam));
}
//---------------------------------------------------------------------------