James,
You should generate your data first, and then generate your contour plot.
cpdata = Table[
x y Sin[30 x] Sin[20 y], {y, 0, 1, .01}, {x, 0, 1, .01}]
ListContourPlot[cpdata, DataRange -> {{0, 1}, {0, 1}}]
you get the same contour plot. Note that Contourplot does not find maxima -- it just plots the digitized function. You can get approximate values (the same ones you would get by processing the contourplot data) by processing the cpdata.
You could use Max and Position to find the max value of the digitized data. You can also use Interpolation to create a fast 2D function for Maximize and other data exploration functions which would give you your values. You could even use the interpolation maxima as a starting point for a FindMaximum on your complex function (with really good bounds) to get more precision, if needed.
For example:
In[23]:= Max[cpdata]
Out[23]= 0.853278
In[24]:= Position[cpdata,Max[cpdata]]
Out[24]= {{88,101}}
In[25]:= N[x y Sin[30 x] Sin[20 y]/. x->100/100/.y->87/100]
Out[25]= 0.853278
Or regenerate the data in Interpolation format: (Note -- I made x go a bit larger than 1 because the max we found was at 1)
cpdata2 = Flatten[Table[{{x,y},x y Sin[30 x] Sin[20 y]},{y,0,1,.01},{x,0,1.1,.01}],1];
cdi = Interpolation[cpdata2]
In[30]:= cdi[1, .87]
Out[30]= 0.853278
In[31]:= FindMaximum[cdi[x,y],{{x,1,.99,1.01},{y,.87,.86,.88}}]
Out[31]= {0.861212,{x->0.995971,y->0.866834}}
Hope this helps
Regards,
Neil