HWND hHwndOpen = OpenFileMapping(FILE_MAP_READ,false,"WFZOperator");
if (hHwndOpen)
{
ShowMessage("³ÌÐòÒѾ­ÔËÐÐ!");
return 0;
}
else
{
HWND hHwnd = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,128,"WFZOperator");
if (hHwnd == NULL)
ShowMessage("½¨Á¢ÄÚ´æÎļþÓ°Éäʧ°Ü!");
}
if (hHwndOpen)
{
ShowMessage("³ÌÐòÒѾ­ÔËÐÐ!");
return 0;
}
else
{
HWND hHwnd = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,128,"WFZOperator");
if (hHwnd == NULL)
ShowMessage("½¨Á¢ÄÚ´æÎļþÓ°Éäʧ°Ü!");
}
解决方案 »
- fastreport调整上、下、左、右边界就好了
- 有关dbExpress的问题
- 在TreeView控件中。如何实现,选择功能,就是checkbox的功能?
- 提交SQL时,资源占用率高的问题,请进。
- vc++里面有个控制台程序可以用来编写一般的c和c++程序,现在我要学pascal(我们学校用pascal的DS),在delphi里面可以吗?怎么办?我可不
- 一个图形方面的问题
- 一分一个
- 菜鸟问题:创建表存盘时老提示“证明违反”,无法存盘。原因?
- 把计算结果写入变量,在报表中,代码已附上,大侠看看?
- 关于TadoTable在纪录为空时出错?(10分)
- 讨论:你认为中国最厉害的五个程序员
- 遇到这样一个问题?
程序不能多次打开和窗体是否在最前好像没有什么必然的联系吧?
MI_QUERYWINDOWHANDLE=1;
MI_RESPONDWINDOWHANDLE=2; MI_ERROR_NONE=0;
MI_ERROR_FAILSUBCLASS=1;
MI_ERROR_CREATINGMUTEX=2;function GetMIError: Integer;implementation
uses Forms, Windows, SysUtils;const
UniqueAppStr='I_am_oldfat';var
MessageID: Integer;
WProc: TFNWndProc;
MutHandle: THandle;
MIError: Integer;function GetMIError: Integer;
begin
Result:=MIError;
end;function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall;
begin
Result:=0;
//如果这是注册过的我的消息
if Msg=MessageID then
begin
case wParam of
MI_QUERYWINDOWHANDLE:
//我已经运行,一个新的实例在向我请求句柄,
//所以显示我自己,并送回句柄
begin
if IsIconic(Application.Handle) then Application.Restore;
PostMessage(HWND(lParam),MessageID,MI_RESPONDWINDOWHANDLE,Application.MainForm.Handle);
end;
MI_RESPONDWINDOWHANDLE:
//已经有一个程序在运行了,并且它已经返回了句柄
//所以让它获得焦点,结束我自己
begin
SetForegroundWindow(HWND(lParam));
Application.Terminate;
end;
end; //end of case
end //end of if
//如果不是我的消息,将它传递出去,给老的window proc
else Result:=CallWindowProc(WProc,Handle,Msg,wParam,lParam);
end;procedure SubClassApplication;
begin
//我subclass Application这个window procedure
//使得Application.OnMessage事件对用户依然有效
WProc:=TFNWndProc(SetWindowLong(Application.Handle,GWL_WNDPROC,Longint(@NewWndProc)));
//如果错误发生,设置相应的错误标志
if WProc=nil then MIError:=MIError or MI_ERROR_FAILSUBCLASS;
end;procedure DoFirstInstance;
//这个过程只能被第一个创建的实例调用
begin
//创建互斥
MutHandle:=CreateMutex(nil,False,UniqueAppStr);
if MutHandle=0 then
MIError:=MIError or MI_ERROR_CREATINGMUTEX;
end;procedure BroadcastFocusMessage;
//当发现已经有一个实例在运行时调用
var
BSMRecipients: DWORD;
begin
//防止主窗体闪烁
Application.ShowMainForm:=false;
//发送消息,与前一个实例建立对话
BSMRecipients:=BSM_APPLICATIONS;
BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
@BSMRecipients,MessageID,MI_QUERYWINDOWHANDLE,Application.Handle);
end;procedure InitInstance;
begin
SubClassApplication; //挂上Application的消息循环队列
Muthandle:=OpenMutex(MUTEX_ALL_ACCESS,false,UniqueAppStr);
if MutHandle=0 then DoFirstInstance //我是第一个
else BroadCastFocusmessage; //已经有了
end;initialization
MessageID:=RegisterWindowMessage(UniqueAppStr);
InitInstance;finalization
//恢复老的Application window procedure
if WProc<>nil then
SetWindowLong(Application.Handle,GWL_WNDPROC,Longint(WProc));
//关闭互斥句柄
if MutHandle<>0 then CloseHandle(MutHandle);end.