| |
|
|
E.T. | Eben benötigt: Messagebox nur mit dem "Abbrechen" - Button (so als Art Hinweis-Box) Bisher möglich:
0 - OK (~MB_OK) 1 - OK Abbrechen (~MB_OKCANCEL) 2 - Abbrechen Wiederholen Ignorieren (~MB_ABORTRETRYIGNORE) 3 - Ja Nein Abbrechen (~MB_YESNOCANCEL) 4 - Ja Nein (~MB_YESNO) 5 - Wiederholen Abbrechen (~MB_RETRYCANCEL)
Hm, ~MB_CANCEL gibts ja wohl (lt. Konstantin Opel) nicht, aber vlt. hat ja jemand dafür 'ne Lösung ?? In diesem zusammenhang dürfte nat. das Prog nicht auf die M-Box warten sondern müsste weiter laufen. Dafür müsste man dann aber wieder das Handle der M-Box wissen, um diese abzufragen...
Hintergrund: Programm liest Daten ein, Hauptfenster wird "deaktiviert". Genau in diesem Fall sollte eine M-Box mit dem Hinweis "Programm liest Daten ein" (oder sowas) erscheinen, welche dem Nutzer die Möglichkeit gibt, das ganze abzubrechen.
Oder bleibt da nur, das Hinweis-Fenster komplett selbst zu erstellen ?? |
|
|
| XProfan X2Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 29.06.2012 ▲ |
|
|
|
|
RGH | Was spricht dagegen, mit "Ok" zu bestätigen, den Hinweis gelesen zu haben? Das sind zumindest die von Windows bereitgestellten Messageboxtypen.
Wenn das Programm weiterlaufen soll, musst Du das Hinwweisfenster eh' selbst erstellen (oder einen eigenen Prozess verwenden).
Gruß Roland |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 29.06.2012 ▲ |
|
|
|
|
| ... oder einen eigenen Thread verwenden oder _ohne eigenen Thread mit der
SetTimer-API einen APC in den Hauptthread injizieren.
Schaue Dir auch mal die Include asyncMsgBox.inc an: [...]
Aus dem Okrea-Code habe ich grad: rausgefitzelt -
damit ermittelt man das Handle des OK-Buttons wenn man das MessageBox-Fensterhandle kennt.
Wenn Du damit nicht weiterkommst dann einfach nochmal melden. |
|
|
| |
|
|
|
| Hihi,
schauma: Herunterladen externer Download
{$cleq}
const asyncMessageBox.Message=1025
declare asyncMessageBox.C&
decimals 0
proc asyncMessageBox
parameters wnd&,s$,tit$,mode&
add asyncMessageBox.C&,1
var h&=globalAlloc(gPTR,24)
long h&,0=addr(s$),addr(tit$),mode&,wnd&,create("text",hWnd,"",0,0,0,0),asyncMessageBox.C&
setWindowLong(long(h&,16),gwl_userdata,setWindowLong(long(h&,16),gwl_wndProc,procaddr(asyncMessageBox.wndProc,4)))
asyncMessageBox.createThread(h&)
while long(h&,0)
sleep 10
wend
whileloop 100
wend
var msg&=long(h&,16)
userMessages asyncMessageBox.Message
globalFree(h&)
var msgboxWnd&=findWindow("."+str$(hWnd)+"."+str$(asyncMessageBox.C&))
settext msgboxWnd&,tit$
return msgboxWnd&
endproc
nProc asyncMessageBox.createThread
parameters h&
createThread(0,0,procAddr(asyncMessageBox.thread,1),h&,0,0)
endproc
nProc asyncMessageBox.wndProc
Parameters wnd&,msg&,wp&,lp&
if msg&=asyncMessageBox.Message
sendMessage(hWnd,asyncMessageBox.Message,wnd&,lp&)
destroyWindow(wnd&)
return 0
endif
return callWindowProc(getWindowLong(wnd&,gwl_userData),wnd&,msg&,wp&,lp&)
endproc
nproc asyncMessageBox.thread
parameters h&
var s$=string$(long(h&,0),0)
var tit$=string$(long(h&,4),0)
var mode&=long(h&,8)
var wnd&=long(h&,12)
var trd&=long(h&,16)
long h&,0=0
sendMessage(trd&,asyncMessageBox.Message,0,messageBox(wnd&,s$,"."+str$(hWnd)+"."+str$(long(h&,20)),mode&))
return 0
endproc
cls
var myMsgBoxWnd&=asyncMessageBox(desktop,"Huhu","Titel",mb_ok)
settext findWindowEx(myMsgBoxWnd&,0,"BUTTON","OK"),"&Abbrechen"
while 1
waitinput
wend
end
Oder hiermit zählts hübsch runter und schließt sich selbständig:
cls
var myMsgBoxWnd&=asyncMessageBox(desktop,"Huhu","Titel",mb_ok)
var btn&=findWindowEx(myMsgBoxWnd&,0,"BUTTON","OK")
var c&=10
while (c&+2) and isWindow(myMsgBoxWnd&)
waitinput 1000
settext btn&,"&Abbrechen ["+str$(c&)+"]"
sub c&,1
wend
case isWindow(myMsgBoxWnd&) : sendMessage(myMsgBoxWnd&,wm_close,0,0)
print "fertsch"
while 1
waitinput
wend
end
|
|
|
| |
|
|
|
| Und hier mal rein per External:
'{$cleq}
decimals 0
cls
var myTimer&=external("user32","SetTimer",0,0,100,procAddr(myMessageBoxAPCProc,4))
print messageBox("Text","."+str$(%hWnd)+".Hallo Welt!",0)
waitinput
end
proc myMessageBoxAPCProc
parameters wnd&,msg&,id&,tme&
var s$="."+str$(%hWnd)+"."
var msgboxWnd&=findWindow(s$)
casenot msgboxWnd& : return
external("user32","KillTimer",0,myTimer&)
settext msgboxWnd&,del$(getText$(msgboxWnd&),1,len(s$))
var btn&=external("user32","FindWindowExA",msgboxWnd&,0,"BUTTON","OK")
casenot btn& : return
setText btn&,"&Abbrechen"
endProc
Damit das so geschrieben aber wiederum 100%ig (statt 99%ig) "absturzsicher" ist, müsste sowas Roland nativ einbauen denn ein APC auf eine interpretierte XProfan- Proc kann immer abstürzen besonders desto komplexer und größer das Programm ist. |
|
|
| |
|
|